• 最短路(dijskra+SPFA+Bellman)


    最短路

    Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 82   Accepted Submission(s) : 51
    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

     
    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
     
    Sample Output
    3 2
    dijskra代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 const int INF=0x3f3f3f3f;
     4 const int MAXN=1010;
     5 #define MIN(x,y) (x<y?x:y)
     6 int map[MAXN][MAXN];
     7 int vis[MAXN],d[MAXN];
     8 int N;
     9 void initial(){
    10     memset(d,INF,sizeof(d));
    11     memset(vis,0,sizeof(vis));
    12     memset(map,INF,sizeof(map));
    13 }
    14 void dijkscra(int s){
    15     int k;
    16     d[s]=0;
    17     while(true){
    18             k=-1;
    19     for(int i=1;i<=N;i++)
    20         if(!vis[i]&&(k==-1||d[i]<d[k]))k=i;
    21             if(k==-1)break;
    22     vis[k]=1;
    23     for(int i=1;i<=N;i++){
    24         d[i]=MIN(d[i],d[k]+map[k][i]);
    25     }
    26     }
    27 }
    28 int main(){
    29     int M;
    30     int a,b,c;
    31     while(~scanf("%d%d",&N,&M),N||M){
    32             initial();
    33         while(M--){
    34             scanf("%d%d%d",&a,&b,&c);
    35             if(c<map[a][b]){
    36                 map[a][b]=map[b][a]=c;
    37             }
    38         }
    39         dijkscra(1);
    40         printf("%d
    ",d[N]);
    41     }
    42     return 0;
    43     }

     SPFA算法:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 #include<algorithm>
     5 using namespace std;
     6 const int INF=0x3f3f3f3f;
     7 const int MAXN=110;
     8 const int MAXM=20010;
     9 int top,vis[MAXN],dis[MAXN],head[MAXM];
    10 int N,M;
    11 queue<int>dl;
    12 struct Edge{
    13     int from,to,value,next;
    14     };
    15     Edge edg[MAXM];
    16 void initial(){
    17     top=0;
    18     memset(vis,0,sizeof(vis));
    19     memset(dis,INF,sizeof(dis));
    20     memset(head,-1,sizeof(head));
    21     while(!dl.empty())dl.pop();
    22 }
    23 void add(int u,int v,int value){
    24         Edge E={u,v,value,head[u]};
    25         edg[top]=E;
    26         head[u]=top++;
    27 }
    28 void SPFA(int sx){
    29     dl.push(sx);
    30     dis[sx]=0;
    31     vis[sx]=1;
    32     while(!dl.empty()){
    33         int u=dl.front();
    34         dl.pop();
    35         vis[u]=0;
    36         for(int i=head[u];i!=-1;i=edg[i].next){
    37                 int v=edg[i].to;
    38             if(dis[u]+edg[i].value<dis[v]){
    39                 dis[v]=dis[u]+edg[i].value;
    40                 if(!vis[v]){
    41                     vis[v]=1;
    42                     dl.push(v);
    43                 }
    44             }
    45         }
    46     }
    47     printf("%d
    ",dis[N]);
    48 }
    49 int main(){
    50     int a,b,c;
    51     while(~scanf("%d%d",&N,&M),N|M){
    52             initial();
    53         while(M--){
    54             scanf("%d%d%d",&a,&b,&c);
    55             add(a,b,c);
    56             add(b,a,c);
    57         }
    58     SPFA(1);
    59     }
    60     return  0;
    61 }

     Bellman:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MIN(x,y)(x<y?x:y)
     4 #define mem(a,b) memset(a,b,sizeof(a))
     5 const int INF=0x3f3f3f3f;
     6 const int MAXN=110;
     7 const int MAXM=10010<<1;
     8 struct Node{
     9     int u,v,w;
    10 };
    11 Node dt[MAXM];
    12 int dis[MAXN];
    13 int top,N;
    14 void add(int u,int v,int w){
    15     dt[top].u=u;
    16     dt[top].v=v;
    17     dt[top++].w=w;
    18 }
    19 void Bellman(int sx){
    20     mem(dis,INF);
    21     dis[sx]=0;
    22     for(int j=1;j<=N;j++)
    23     for(int i=0;i<top;i++){
    24         int u=dt[i].u,v=dt[i].v,w=dt[i].w;
    25         dis[v]=MIN(dis[v],dis[u]+w);
    26     }
    27 }
    28 int main(){
    29     int M;
    30     while(~scanf("%d%d",&N,&M),N||M){
    31         int a,b,c;
    32         top=0;
    33         while(M--){
    34             scanf("%d%d%d",&a,&b,&c);
    35             add(a,b,c);
    36             add(b,a,c);
    37         }
    38         Bellman(1);
    39         printf("%d
    ",dis[N]);
    40     }
    41     return 0;
    42 }
  • 相关阅读:
    怎样打开64位 Ubuntu 的32位支持功能?
    HDOJ 1312题Red and Black
    课程设计,文件加密
    一首诗的代码
    HDOJ1021题 Fibonacci Again 应用求模公式
    HDOJ 1013题Digital Roots 大数,9余数定理
    codevs 3314 魔法森林
    codevs 1144 守望者的逃离
    Wormholes
    codevs 1507 酒厂选址
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4737543.html
Copyright © 2020-2023  润新知