hdu 1599 最小环算法,由于并不是很难,所以放在代码里讲解了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 200000000
using namespace std;
int dp[102][102],table[102][102]; //table负责存储图 dp负责求dp【i】【j】 i 到 j 的最小距离
int main()
{
int n,m,i,j,k,ans;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
table[i][j]=table[j][i]=dp[i][j]=dp[j][i]=N; // table和dp的初始化
dp[i][i]=table[i][i]=0;
}
int a,b,c;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
table[a][b]=table[b][a]=dp[a][b]=dp[b][a]=min(c,table[a][b]); // table输入 ,注意 i 到 j 可能存在多个路径,存储最小的
}
ans=N;
for(k=1;k<=n;k++)
{ //核心部分 求最大节点为k的最小环,大家可能会想为什么是最大节点为k的最小环,因为前 k-1 层循环的dp只是
//更新了最大节点为k-1的最小环,并没有用到 k 点
for(i=1;i<k;i++)
for(j=1;j<i;j++)
ans=min(ans,dp[i][j]+table[i][k]+table[k][j]);
//Floyd算法的常规部分
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
if(ans>=N) //最小距离比初始化的距离还大或相等则,不存在路径
printf("It's impossible.\n");
else
printf("%d\n",ans);
}
return 0;
}