HDOJ 3790

#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct Road{
    int d;
    int p;

}Road;
Road road[1005][1005];
#define INF 0xfffffff
int n,m;

void dij(int s,int t)
{
    bool visited[1005];
    int dis[1005];
    int price[1005];
    for(int i=1;i<=n;i++)
    {
        visited[i]=false;
        dis[i]=road[s][i].d;
        price[i]=road[s][i].p;
    }
    visited[s]=true;
    dis[s]=0;
    price[s]=0;
    for(i=1;i<n;i++)
    {
        int min=INF;
        int node=0;
        for(int j=1;j<=n;j++)
        {
            if(!visited[j]&&dis[j]<min)
            {
                min=dis[j];
                node=j;
            }

        }
        visited[node]=true;
        for(j=1;j<=n;j++)
        {
            if(!visited[j]&&dis[j]>min+road[node][j].d)
            {
                dis[j]=min+road[node][j].d;
                price[j]=price[node]+road[node][j].p;
            }
            else if(!visited[j]&&dis[j]==min+road[node][j].d)
            {
                if(price[j]>price[node]+road[node][j].p)
                    price[j]=price[node]+road[node][j].p;
            }
        }
    }
    printf("%d %d\n",dis[t],price[t]);
}
int main()
{
    while(scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            break;
        int i;
        for(i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                road[i][j].d=INF;
                road[i][j].p=INF;
            }
        for(i=1;i<=m;i++)
        {
            int temp1,temp2,temp3,temp4;
            scanf("%d%d%d%d",&temp1,&temp2,&temp3,&temp4);
        //    cin>>temp1>>temp2>>temp3>>temp4;
            if(road[temp1][temp2].d>temp3)
            {
                road[temp1][temp2].d=road[temp2][temp1].d=temp3;
                road[temp1][temp2].p=road[temp2][temp1].p=temp4;
            }
            else if(road[temp1][temp2].d==temp3)
            {
                if(road[temp1][temp2].p>temp4)
                    road[temp1][temp2].p=road[temp2][temp1].p=temp4;
            }
        }//input is over
        int s,t;
        scanf("%d%d",&s,&t);
        //cin>>s>>t;
        dij(s,t);
    }
    return 0;
}

 

posted @ 2012-03-15 17:16  dupuleng  阅读(60)  评论(0)    收藏  举报