HDU 2544 最短路

来源:互联网 发布:神经网络算法实例说明 编辑:程序博客网 时间:2024/06/03 23:00

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 68128    Accepted Submission(s): 29787


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 11 2 33 31 2 52 3 53 1 20 0
 

Sample Output
32
 今天学了最短路,感觉这个东西很神奇~~~Floyd算法很简单,而Dijkstra(这名字咋读?)也可以,有点广搜的味道~
这道题就是很基本的最短路问题,分别用了这两种算法实现。
Floyd短小精悍
#include<iostream>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        if(!n&&!m) break;        int map[150][150];        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                map[i][j]=inf;            }        }        while(m--){            int a,b,c;            cin>>a>>b>>c;            map[a][b]=map[b][a]=c;        }        for(int k=1;k<=n;k++){            for(int i=1;i<=n;i++){                for(int j=1;j<=n;j++){                    if(map[i][j]>map[i][k]+map[k][j]){                        map[i][j]=map[i][k]+map[k][j];                    }                }            }        }        cout<<map[1][n]<<endl;    }}
Dijkstra算法
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;int main(){int n,m;while(~scanf("%d%d",&n,&m)){if(!n&&!m) break;int map[110][110];int book[110];int dis[110];for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=map[j][i]=inf;}}while(m--){int a,b,c;cin>>a>>b>>c;map[a][b]=map[b][a]=c;}for(int i=1;i<=n;i++) dis[i]=map[1][i];memset(book,0,sizeof(book));book[1]=1;int flag=0;for(int i=1;i<=n-1;i++){int minn=inf;for(int j=1;j<=n;j++){if(!book[j]&&dis[j]<minn){minn=dis[j];flag=j;}}book[flag]=1;for(int i=1;i<=n;i++){if(map[flag][i]<inf){if(dis[i]>dis[flag]+map[flag][i]){dis[i]=dis[flag]+map[flag][i];}}}}cout<<dis[n]<<endl;}}

SPFA算法

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int inf=0x3f3f3f3f;int map[1010][1010];int dis[1010];int book[1010];int n,m;void spfa(){memset(book,0,sizeof(book));queue<int> que;for(int i=0;i<=n;i++) dis[i]=inf;dis[1]=0;book[1]=1;que.push(1);while(!que.empty()){int now=que.front();que.pop();for(int i=1;i<=n;i++){if(dis[i]>dis[now]+map[now][i]){dis[i]=dis[now]+map[now][i];if(!book[i]){book[i]=1;que.push(i);}}}book[now]=0;} return;}int main(){while(~scanf("%d%d",&n,&m)){if(!n&&!m) break;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=inf;}}for(int i=1;i<=m;i++){int a,b,len;scanf("%d%d%d",&a,&b,&len);map[a][b]=map[b][a]=len;}spfa();cout<<dis[n]<<endl;}}



原创粉丝点击