九度 OJ 1008 最短路徑問題


#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define INF 1<<30
using std::vector;
int n,m,graph[2][1001][1001],s,t,D[1001],P[1001];
bool visited[1001];
//vector<int> p[1001];
void Dijkstra()
{
    int i,j;
    //visited[s]=1;
    for(i=1;i<=n;i++)
    {
        D[i]=INF;
        P[i]=INF;
    }
    P[s]=0;
    D[s]=0;
    for(j=1;j<=n;j++)
    {
        int min=INF;
        int k=-1;
        for(i=1;i<=n;i++)
        {
            if(visited[i]==0&&min>D[i])
            {
                min=D[i];
                k=i;
            }
        }
        if(k!=-1)
        {
            visited[k]=1;
            for(i=1;i<=n;i++)
            {
                if(visited[i]==0&&D[i]>=D[k]+graph[0][k][i])
                {
                    if(D[i]>D[k]+graph[0][k][i])
                    {
                        D[i]=D[k]+graph[0][k][i];
                        P[i]=P[k]+graph[1][k][i];
                        //printf("%d %d %d\n",i,D[type][i],P[i]);
                    }
                    else if(D[i]==D[k]+graph[0][k][i]&&P[i]>P[k]+graph[1][k][i])
                    {
                        P[i]=P[k]+graph[1][k][i];
                    }
 
                }
            }
        }
    }
}
int main()
{
    int i,j;
    //printf("%d\n",INF);
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0) break;
        else{
            int a,d,b,p1;
            memset(visited,0,sizeof(visited));
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    if(i==j)
                    {
                        graph[0][i][j]=0;
                        graph[1][i][j]=0;
                    }
                    else
                    {
                        graph[0][i][j]=INF;
                        graph[1][i][j]=INF;
                    }
                }
                for(i=1;i<=m;i++)
                {
                    scanf("%d%d%d%d",&a,&b,&d,&p1);
                    graph[0][a][b]=d;
                    graph[0][b][a]=d;
                    graph[1][a][b]=p1;
                    graph[1][b][a]=p1;
                }
                scanf("%d%d",&s,&t);
                Dijkstra();
                printf("%d %d\n",D[t],P[t]);
            }
    }
}
 
/**************************************************************
    Problem: 1008
    User: th是個小屁孩
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:9356 kb
****************************************************************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章