http://acm.split.hdu.edu.cn/showproblem.php?pid=1599
分析:
求无向图最小环 利用folyd的性质在 i---j 间插点 每次得到 i-j 之间目前最短路 在此基础上找到另一条目前 i-j 的最短路 map[i][k]+map[k][j] 图无向既能成环
k 在k-1的基础上找到 i-j 的路 所以不会有重复的点
AC代码:
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
int maxinf=0x3f3f3f3f;
int N,M;
LL map[110][110];
LL dis[110][110];
LL minn;
void floyd(){
for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
dis[i][j]=map[i][j];
}
}
minn=0x3f3f3f3f;
for (int k=1;k<=N;k++){
for (int i=1;i<=N;i++){
for (int j=i+1;j<=N;j++){
minn=min(minn,dis[i][j]+map[i][k]+map[k][j]);
}
}
for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
if (dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
int main (){
int n,m;
LL t;
while (cin>>N>>M){
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
map[i][j]=maxinf;
while (M--){
cin>>n>>m>>t;
t=min(map[n][m],t);
map[n][m]=t; map[m][n]=t;
}
floyd();
if (minn==0x3f3f3f3f) cout<<"It's impossible."<<endl;
else cout<<minn<<endl;
}
return 0;
}
本文介绍了一种使用Floyd算法求解无向图中最小环的方法,并提供了详细的AC代码实现。通过两次遍历寻找两个不同的最短路径来构成环。
988

被折叠的 条评论
为什么被折叠?



