题目链接:https://vjudge.net/problem/UVA-11183
题目思路:典型的朱刘算法https://blog.csdn.net/txl199106/article/details/62045479
AC代码
#include<bits/stdc++.h>
using namespace std;
#define N 1300
int pre[N];
int in[N];
int id[N];
int v[N];
struct edge{
int u;
int v;
int w;
edge(int a=0,int b=0,int c=0)
{
u=a;
v=b;
w=c;
}
};
vector<edge>es;
int n,m;
long long ans;
bool Liuzhualg(int root)
{
while(1)
{
memset(pre,-1,sizeof(pre));
memset(in,0x3f3f3f3f,sizeof(in));
memset(v,-1,sizeof(v));
memset(id,-1,sizeof(id));
v[root]=0;
pre[root]=root;
in[root]=0;
for(int i=0;i<es.size();++i)
{
if(in[es[i].v]>es[i].w&&es[i].u!=es[i].v)
{
in[es[i].v]=es[i].w;
pre[es[i].v]=es[i].u;
}
}
for(int i=0;i<n;++i)
{
if(in[i]==0x3f3f3f3f)
return false;
ans+=in[i];
}
int idx=0;
for(int i=0;i<n;++i)
{
int t=i;
while(v[t]==-1)
{
v[t]=i;
t=pre[t];
}
if(v[t]!=i||t==root)
continue;
id[t]=idx++;
for(int j=pre[t];j!=t;j=pre[j])
id[j]=idx-1;
}
if(idx==0)
return true;
for(int i=0;i<n;++i)
{
if(id[i]==-1)
id[i]=idx++;
}
for(int i=0;i<es.size();++i)
{
es[i].w-=in[es[i].v];
es[i].u=id[es[i].u];
es[i].v=id[es[i].v];
}
n=idx;
root=id[root];
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
int ca=1;
while(t--)
{
ans=0;
es.clear();
scanf("%d%d",&n,&m);
for(int i=0;i<m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
es.push_back(edge(x,y,z));
}
if(Liuzhualg(0))
printf("Case #%d: %lld\n",ca++,ans);
else
printf("Case #%d: Possums!\n",ca++);
}
}