题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
tip:记录一下floyd算法,本质是区间DP的思想,用邻接矩阵存储图,若两个点无边则标记为正无穷,接着枚举中转点k,起点i和终点j,若e[i][j]>e[i][k]+e[k][j]说明从i点到j点经过k点距离更小则更新。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=205;
int e[maxn][maxn];
int main()
{
int n,m,s,t,x,y,z;
while(cin>>n>>m){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) e[i][j]=0;
else e[i][j]=1e9;
}
}
for(int i=0;i<m;i++){
cin>>x>>y>>z;
e[x][y]=min(e[x][y],z);
e[y][x]=min(e[y][x],z);
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
}
cin>>s>>t;
if(e[s][t]!=1e9) cout<<e[s][t]<<endl;
else cout<<-1<<endl;
}
return 0;
}