只适用于无向图,而且复杂度有点高O(n^3),但是我还是蛮喜欢这个算法的qwq……
简单易懂(或许这就是喜欢的原因>\<),就只给代码啦~ -^-
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define maxn 1e8 int ans=maxn,g[100][100],d[100][100],n,m; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { g[i][j]=maxn; d[i][j]=maxn; } for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); g[a][b]=c; g[b][a]=c; d[a][b]=c; d[b][a]=c; } for(int k=1;k<=n;k++) { for(int i=1;i<=k-1;i++) for(int j=i+1;j<=k-1;j++) ans=min(ans,d[i][j]+g[j][k]+g[k][i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } printf("%d",ans); return 0; }
小注解:
k可以理解为点,每一次只要考虑这个点有没有对现有的最优答案有益即可。