276. 无向图最小环

【题目描述】:

给定一张无向图,求图中一个至少包含 3个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题。在本题中,你需要输出最小环的边权之和。若无解,输出 “No solution.”。图的节点数不超过 100。

【输入描述】:

第一行两个正整数 n,m表示点数和边数。

接下来 m行,每行三个正整数 x,y,z,表示节点 x,y之间有一条长度为 z的边。

【输出描述】:

输出一个最小环的边权之和。若无解,输出 “No solution.”

【样例输入】: 5 7 1 4 1 1 3 300 3 1 10 1 2 16 2 3 100 2 5 15 5 3 20

【样例输出】: 61

【时间限制、数据范围及描述】:

时间:1s 空间:512M

对于 20%的数据:1<=n<=10;

对于100%的数据:1<=n<=100;边权<=300。

代码

#include<algorithm>
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int n,m,f[101][101],g[101][101],x,y,z; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ f[i][j]=1<<28; } } for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ g[i][j]=1<<28; } } for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); z=min(z,g[x][y]); f[x][y]=z; f[y][x]=z; g[x][y]=z; g[y][x]=z; } int ans=2147483647; for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ ans=min(ans,g[i][k]+g[k][j]+f[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } } } if(ans==268435458){ printf("No solution.\n"); } else{ printf("%d\n",ans); } return 0; } 

每日任务:(发牢骚)作业真的多。

不断循环,判断是否存在循环,如果有的话,并且有多个,则相互比较,找出最小的。

猜你喜欢

转载自www.cnblogs.com/xiongchongwen/p/11137602.html
今日推荐