问题链接:HDU2544
问题简述:
每组数据第一行是两个整数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分钟的时间走过这条路。求工作人员从商店走到赛场的最短时间
问题分析:
最短路水题。
用来练手最短路,目标是每天练5遍floyd,dij,dij堆优化+邻接表优化,毕竟最短路非常常见,尽量训练至将时间控制在3-4分钟写出最短路算法,并且无BUG一遍过。
AC通过的C++语言程序如下:
————————————————
1.floyd
#include<bits/stdc++.h>
using namespace std;
int mp[105][105];
void floyd(int n){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]>mp[i][k]+mp[k][j]){
mp[i][j]=mp[i][k]+mp[k][j];
}
}
}
}
}
int main(){
int n,m;
while(cin>>n>>m&&(n||m)){
memset(mp,0x3f,sizeof(mp));
for(int i=0;i<m;i++){
int u,v,cost;
cin>>u>>v>>cost;
mp[u][v]=mp[v][u]=cost;
}
floyd(n);
cout<<mp[1][n]<<endl;
}
}
2.普通dij:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int mp[105][105];
int d[105];
bool vis[105];
void init(){
memset(d,0x3f,sizeof(d));
memset(mp,0x3f,sizeof(mp));
memset(vis,0,sizeof(vis));
}
void dij(int n){
d[1]=0;
while(1){
int v=-1;
for(int i=1;i<=n;i++){
if(!vis[i]&&(v==-1||d[i]<d[v])){
v=i;
}
}
if(v==-1){
break;
}
vis[v]=1;
for(int i=1;i<=n;i++){
if(!vis[i]&&d[i]>d[v]+mp[v][i]){
d[i]=d[v]+mp[v][i];
}
}
}
}
int main(){
int n,m;
while(cin>>n>>m&&(n||m)){
init();
int u,v,cost;
for(int i=0;i<m;i++){
cin>>u>>v>>cost;
mp[u][v]=mp[v][u]=cost;
}
dij(n);
cout<<d[n]<<endl;
}
}