2018-5-1
我用的是floyd算法,不得不说,这个算法还是相当的优美了;
虽然说时间复杂度达到了O(n^3),但是代码还是相当简洁了!
……
对于这个题目而言,有几点需要注意的地方:
1)赋值是双向的,比如说a,b之间有一条要花费time时间的路,那么我们需要将x[a][b]与x[b][a]都赋值为time。
2)有重边:对于这种情况我们需要取最小的边。
3)如果起点和终点相同的话,输出的结果应该是0。
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 100;
int x[N+1][N+1];
int n,m;
void floyd(){
int i,j,k;
for (k=0;k<n;k++){
for (i=0;i<n;i++){
for (j=0;j<n;j++){
x[i][j]=min(x[i][k]+x[k][j],x[i][j]);
}
}
}
}
int main(){
int i,j,a,b,t,s,e;
while (cin>>n>>m){
for (i=0;i<n;i++){
for (j=0;j<n;j++){
x[i][j]=inf;
}
x[i][i]=0;
}
for (i=1;i<=m;i++){
cin>>a>>b>>t;
x[a][b]=x[a][b]<t?x[a][b]:t;
x[b][a]=x[a][b]<t?x[a][b]:t;
}
cin>>s>>e;
floyd();
if (x[s][e]==inf) cout<<-1<<endl;
else cout<<x[s][e]<<endl;
}
return 0;
}