【模板】朱刘算法
【模板】朱刘算法
#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;
}