最小环(有向图,无向图)

无向图

#include
#include
#include
#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!"<

详细题解可以移步到
(298条消息) 图论最小环问题求解_图的最小环是顶点个数还是权值_AAMahone的博客-CSDN博客

有向图

P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

未能AC

#include 
#include 
#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

 

你可能感兴趣的:(2023蓝桥杯,c++,算法,开发语言)