来源:POJ2378
最短路水题
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int T,n;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
int mp[MAXN][MAXN];
int dist[MAXN];
bool vis[MAXN];
void dijskra(){
memset(vis,false ,sizeof(vis));
for(int i=1;i<=n;i++){
dist[i] = mp[n][i];
// cout<<dist[i]<<" ";
}
//cout<<endl;
int dm,dv;
vis[n] = true;
for(int i=1;i<=n;i++){
dm = INF;
dv = -1;
for(int j=1;j<=n;j++){
if(!vis[j]&& dm>dist[j]){
dm = dist[j];
dv = j;
}
}
//cout<<dv<<endl;
if(dv == -1) return;
vis[dv]=true;
for(int j=1;j<=n;j++){
if(!vis[j] && dist[j]>dm+mp[dv][j]){
dist[j] = dm+mp[dv][j];
}
}
}
}
int main(){
int a,b,w;
while(scanf("%d%d",&T,&n)!=EOF){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j] = INF;
while(T--){
scanf("%d%d%d",&a,&b,&w);
if(mp[a][b]>w)
mp[a][b] = mp[b][a] = w;
}
/* for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<mp[i][j]<<' ';
}
cout<<endl;
}*/
dijskra();
printf("%d\n",dist[1]);
}
return 0;
}