hdu 3790 最短路径问题 迪杰斯特拉

来源:互联网 发布:唾液可以杀菌消炎 知乎 编辑:程序博客网 时间:2024/04/28 11:47

先选长度小的,长度相等,选花费小的,注意细节即可。

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3790

#include <stdio.h>#include <string.h>#include <stdlib.h>const int MAXN=1010;const int INF=0x3f3f3f3f;bool vis[MAXN];int pre[MAXN];int cost[MAXN][MAXN];int money[MAXN][MAXN];int lowcost[MAXN];int lowmoney[MAXN];void Init(){    memset(cost,0x3f,sizeof(cost));    memset(money,0x3f,sizeof(money));    memset(lowcost,0x3f,sizeof(lowcost));    memset(lowmoney,0x3f,sizeof(lowmoney));    memset(vis,0,sizeof(vis));    memset(pre,-1,sizeof(pre));}void Dijkstra(int n,int beg){    lowcost[beg] = 0;    lowmoney[beg] = 0;    for(int j=0;j<n;j++){        int k=-1;        int Min=INF;        int Minmoney = INF;        for(int i=0;i<n;i++){            if(!vis[i]&&lowcost[i]<Min){                Min=lowcost[i];                Minmoney = lowmoney[i];                k=i;            }            else if(!vis[i]&&lowcost[i]==Min&&lowmoney[i]<Minmoney){                Minmoney = lowmoney[i];                Min = lowcost[i];                k = i;            }        }        if(k==-1)break;        vis[k]=true;        for(int i=0;i<n;i++){            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){                lowcost[i]=lowcost[k]+cost[k][i];                lowmoney[i] = lowmoney[k] + money[k][i];                pre[i]=k;            }            else if(!vis[i]&&lowcost[k]+cost[k][i]==lowcost[i]&&                    lowmoney[k] + money[k][i]<lowmoney[i]){                lowcost[i]=lowcost[k]+cost[k][i];                lowmoney[i] = lowmoney[k] + money[k][i];                pre[i]=k;               }        }    }}void Input(){    int n,m;    while(scanf("%d %d",&n,&m),n+m){        int tempa,tempb,tempr,tempm;        Init();        for(int i=0;i<m;i++){            scanf("%d %d %d %d",&tempa,&tempb,&tempr,&tempm);            tempa--;tempb--;            if(cost[tempa][tempb]>tempr){                cost[tempa][tempb] = tempr;                cost[tempb][tempa] = tempr;                money[tempa][tempb] = tempm;                money[tempb][tempa] = tempm;            }            else if(cost[tempa][tempb]==tempr&&money[tempa][tempb]>tempm){                money[tempa][tempb] = tempm;                money[tempb][tempa] = tempm;            }        }        int s,t;        scanf("%d %d",&s,&t);        Dijkstra(n,s-1);        printf("%d %d\n",lowcost[t-1],lowmoney[t-1]);    }}void File(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdout);}int main(void){//    File();    Input();    return 0;}



0 0
原创粉丝点击