HDU 3790 최 단 경로 문제 (dijk 최 단 경로 변형)

제목 주소:http://acm.hdu.edu.cn/showproblem.php?pid=3790
이번에 도 한꺼번에 쓰 고 디 버 깅 도 안 하고 바로 AC 가 될 줄 은 몰 랐 는데...............................................매번 그 랬 으 면 좋 겠 는데...
본론 으로 돌아 가면 이 문제 도 매우 훌륭 하 다. 바로 가장 짧 은 길 에 2 급 으로 정렬 하 는 것 과 비슷 하 다.디 제 스 트 라 알고리즘 으로 작 게 변형 되 었 습 니 다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>

using namespace std;
int d[1100], ans[1100][1100], pri[1100][1100], vis[1100], maxint=1000000000, s, t, n, p[1100];
void dijk()
{
    int i, j, pos,min1, min2;
    for(i=1;i<=n;i++)
        {
            d[i]=ans[s][i];
            p[i]=pri[s][i];
        }
    d[s]=0;
    vis[s]=1;
    for(i=1;i<n;i++)
    {
        min1=maxint;
        min2=maxint;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&min1>d[j])
            {
                min1=d[j];
                pos=j;
                min2=p[j];
            }
            else if(!vis[j]&&min1==d[j])
            {
                if(min2>p[j])
                {
                    min2=p[j];
                    pos=j;
                    min1=d[j];
                }
            }
        }
        vis[pos]=1;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&d[j]>ans[pos][j]+d[pos])
            {
                d[j]=ans[pos][j]+d[pos];
                p[j]=pri[pos][j]+p[pos];
            }
            else if(!vis[j]&&d[j]==ans[pos][j]+d[pos])
            {
                if(p[j]>pri[pos][j]+p[pos])
                {
                    p[j]=pri[pos][j]+p[pos];
                }
            }
        }
    }
    printf("%d %d
",d[t],p[t]); } int main() { int i, m, a, b, c, d, j; while(scanf("%d%d",&n,&m)!=EOF&&n&&m) { memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { ans[i][j]=maxint; } while(m--) { scanf("%d%d%d%d",&a,&b,&c,&d); if(ans[a][b]>c) { ans[a][b]=c; ans[b][a]=c; pri[a][b]=pri[b][a]=d; } } scanf("%d%d",&s,&t); dijk(); } return 0; }

좋은 웹페이지 즐겨찾기