【模板】朱刘算法

【模板】朱刘算法

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+2;

int root,n,m;

struct Edge {
	int u,v,w;
}e[N];

int id[N],vis[N],pre[N],incost[N];

void zhuliu() {
	int tn=0;
	int res=0;
	while(1) 
	{
		tn=0;
		for(int i=1;i<=n;i++) {
			id[i]=vis[i]=-1;
			incost[i]=INT_MAX;
		}
		
		for(int i=1;i<=m;i++) {
			int u,v;
			u=e[i].u; v=e[i].v;
			if(u!=v && e[i].w<incost[v]) {
				incost[v]=e[i].w;
				pre[v]=u;
			}
		}
		
		for(int i=1;i<=n;i++) {
			if(i!=root && incost[i]==INT_MAX)
			{
				printf("NO");
				return ;
			}
		}
		
		incost[root]=0;
		for(int i=1;i<=n;i++) {
			res+=incost[i];
			int v=i;
			while(vis[v]!=i && id[v]==-1 && v!=root)
			{
				vis[v]=i;
				v=pre[v];
			}
			if(id[v]==-1 && v!=root) {
				tn++;
				int u=i;
				do {
					id[u]=tn;
					u=pre[u];
				} while(u!=v);
			}
		}
		
		if(!tn) {
			printf("YES %d",res);
			return ;
		}
		for(int i=1;i<=n;i++) {
			if(id[i]==-1) {
				id[i]=++tn;
			}
		}
		
		int i=1;
		while(i<=m) 
		{
			int vv=e[i].v;
			e[i].u=id[e[i].u];
			e[i].v=id[e[i].v];
			if(e[i].u!=e[i].v) {
				e[i].w-=incost[vv];
				i++;
			}
			else {
				swap(e[i],e[m--]);
			}
		}
		root=id[root];
		n=tn;
	}
}

int main() {
	
	return 0;
}
posted on 2024-11-21 22:25  Ueesugi_sakura  阅读(2)  评论(0编辑  收藏  举报