无向图
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define inf 1<<29
using namespace std;
int e[maxn][maxn],dis[maxn][maxn];
void init(int n) {
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= n; j++) {
if(i == j)
e[i][j] = dis[i][j] = 0;
else
e[i][j] = dis[i][j] = inf;
}
}
}
int Floyd(int n) {
int mincircle = inf;
for(int k = 0; k <= n; k++) {
for(int i = 0; i < k; i++) {
for(int j = i+1; j < k; j++) {
mincircle = min(mincircle,e[i][k]+e[k][j]+dis[i][j]); //最小环公式;
}
}
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= n; j++) {
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]); //正常Floyd;
}
}
}
return mincircle;
}
int main() {
int n,m,u,v,w,ans;
while(cin>>n>>m) {
init(n);
for(int i = 0; i < m; i++) {
cin>>u>>v>>w;
e[u][v] = dis[u][v] = w;
e[v][u] = dis[v][u] = w;
}
ans = Floyd(n);
if(ans == inf)
cout<<"No Solution!"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
详细题解可以移步到
(298条消息) 图论最小环问题求解_图的最小环是顶点个数还是权值_AAMahone的博客-CSDN博客
有向图
P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
未能AC
#include <iostream>
#include <cstdio>
#define INF 200001
//开过 0x7fffffff和 0x3f3f3f3f之后 一怒之下...
//用 0x7fffffff或 0x3f3f3f3f的话一定要开long long
using namespace std;
const int N=5005;
int n;
int ans;
int dis[N][N],g[N][N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(i==j)
dis[i][j]=g[i][j]=0;
else
dis[i][j]=dis[j][i]=g[i][j]=g[j][i]=INF;
}
}
int x;
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
dis[i][x]=g[i][x]=1;
}
ans=INF;
for(int k=1;k<=n;++k)
{
for(int i=1;i<k;++i)
{
for(int j=i+1;j<k;++j)
{
ans=min(ans,dis[j][i]+g[i][k]+g[k][j]);
//注意是dis[j][i]不是dis[i][j]
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
printf("%d\n",ans);
return 0;
}