HDU 1874畅通工程续(最短路水题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
题目大意:就是最简单的最短路,唯一需要注意的一点就是到达一个城市的路可能有多条,你要选取最短的那条。
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 205
int mp[maxn][maxn],vis[maxn],n,m,dis[maxn];
void djk(int st){
int i,j,k;
for(i=0;i<n;i++){
if(i==st)
dis[i]=0;
else
dis[i]=mp[st][i];
}
for(i=0;i<n-1;i++){
int mi=inf,u;
for(j=0;j<n;j++){
if(dis[j]<mi&&!vis[j]){
mi=dis[j];
u=j;
}
}
vis[u]=1;
for(k=0;k<n;k++){
if(mp[u][k]!=inf)
if(dis[k]>dis[u]+mp[u][k]){
dis[k]=dis[u]+mp[u][k];
}
}
}
}
int main()
{
int i,j,k;
while(cin>>n>>m){
memset(mp,inf,sizeof(mp));
memset(vis,0,sizeof(vis));
for(i=0;i<m;i++){
int x,y,z;
cin>>x>>y>>z;
if(mp[x][y]>z){//选取最短的通路
mp[x][y]=z;
mp[y][x]=z;
}
}
int start,end;
cin>>start>>end;
djk(start);
if(dis[end]==inf)
cout<<-1<<endl;
else
cout<<dis[end]<<endl;
}
}
Just do it