Hud 3790 最短路径问题[基础最短路Dijkstra]

来源:互联网 发布:erp软件怎么用 编辑:程序博客网 时间:2024/04/28 20:49

题目链接:点击打开链接

pay与dis一起进行更新。

代码:

#include<cstdio>#include<cstring>#define INF 0xffffffconst int N=1005;int Map[N][N],pMap[N][N];int dis[N],pay[N];bool vis[N];int n,m;void Init(){    for(int i=1;i<=n;i++)    for(int j=1;j<=n;j++)    {Map[i][j]=INF;pMap[i][j]=INF;}}void Dijkstra(int u0){    memset(vis,0,sizeof(vis));    vis[u0]=true;    for(int i=1;i<=n;i++)    {dis[i]=Map[u0][i];pay[i]=pMap[u0][i];}    dis[u0]=0;pay[u0]=0;//    for(int k=1;k<=n;k++)//    printf("(%d %d)\n",dis[k],pay[k]);    for(int i=1;i<=n;i++)    {        int temp=INF,ptemp=INF,t=u0;        for(int j=1;j<=n;j++)        if(!vis[j])        {            if(temp>dis[j])            {temp=dis[j];ptemp=pay[j];t=j;}            else if(temp==dis[j]&&ptemp>pay[j])            {temp=dis[j];ptemp=pay[j];t=j;}        }        if(t==u0) return;        vis[t]=true;        for(int j=1;j<=n;j++)        if(!vis[j])        {            if(dis[j]>dis[t]+Map[t][j])            {dis[j]=dis[t]+Map[t][j];pay[j]=pay[t]+pMap[t][j];}            else if(dis[j]==dis[t]+Map[t][j]&&pay[j]>pay[t]+pMap[t][j])            {dis[j]=dis[t]+Map[t][j];pay[j]=pay[t]+pMap[t][j];}        }    }}int main(){    while(scanf("%d%d",&n,&m)&&(n+m))    {        Init();        for(int i=1;i<=m;i++)        {            int a,b,d,p;            scanf("%d%d%d%d",&a,&b,&d,&p);            if(d<Map[a][b])            {                Map[a][b]=d;Map[b][a]=d;                pMap[a][b]=p;pMap[b][a]=p;            }            else if(d==Map[a][b]&&p<pMap[a][b])            {                Map[a][b]=d;Map[b][a]=d;                pMap[a][b]=p;pMap[b][a]=p;            }        }        int s,t;        scanf("%d%d",&s,&t);        Dijkstra(s);//        for(int k=1;k<=n;k++)//        printf("%d %d\n",dis[k],pay[k]);        printf("%d %d\n",dis[t],pay[t]);    }    return 0;}


原创粉丝点击