最短路径问题 多加了一个费用 http://acm.hdu.edu.cn/showproblem.php?pid=3790

来源:互联网 发布:seo经验分享 编辑:程序博客网 时间:2024/05/02 00:05
#include<iostream>#include<algorithm>#include<cstdio>#define INF 0x3f3f3fusing namespace std;const int maxn = 1002;int G[maxn][maxn],pay[maxn][maxn];int dist[maxn],cost[maxn];bool vis[maxn];int n,m;void  Prim(int x){    for(int i=1;i<=n;i++){        dist[i]=G[x][i];        cost[i]=pay[x][i];        vis[i]=0;    }    vis[x]=1;    while(1)    {           vis[0]=1,dist[0]=cost[0]=0;        int min2=INF,min1=INF,p;        for(int i=1;i<=n;i++){                if(!vis[i])                {                    if(dist[i]<min2)                    {                        min2=dist[i];min1=cost[i];p=i;                    }                    else                    {                        if(dist[i]==min2&&cost[i]<min1)                        {                              min2=dist[i];min1=cost[i];p=i;                        }                    }                }        }        if(min2==INF)break;        vis[p]=1;        for(int i=1;i<=n;i++)                if(!vis[i])                {                    if(dist[i]>G[p][i]+dist[p])                    {                        dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p];                    }                    else                    {                        if((dist[i]==G[p][i]+dist[p])&&(cost[i]>pay[p][i]+cost[p]))                        {                            dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p];                        }                    }                }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++)            {                G[i][j]=G[j][i]=INF;                G[i][i]=0;                pay[i][j]=pay[j][i]=INF;                pay[i][i]=0;            }        }        for(int i=1;i<=m;i++)            {                int a,b,v,k;                cin>>a>>b>>v>>k;                if(G[a][b]>v)                {                    G[a][b]=G[b][a]=v;                    pay[a][b]=pay[b][a]=k;                }                else                if(G[a][b]==v&&pay[a][b]>k) G[a][b]=G[b][a]=v,pay[a][b]=pay[b][a]=k;            }        int n1,m1;        cin>>n1>>m1;        Prim(n1);      cout<<dist[m1]<<" "<<cost[m1]<<endl;    }    return 0;}


 

0 0