题意:求最大流。
难度:1
题解:略。
难度:1
题解:略。
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int mxn=110;
const int mxf=0x7fffffff;
int n,np,nc,m;
int resi[mxn][mxn],ef[mxn],h[mxn],s,t,V;
queue<int> Q;
void push_relable()
{
int i,j,sum=0,u,v,p;
for(i=1;i<=V;i++)
h[i]=ef[i]=0;
h[s]=V;ef[s]=mxf;ef[t]=-mxf;
Q.push(s);
while(!Q.empty())
{
u=Q.front();Q.pop();
for(v=1;v<=V;v++)
{
p=(resi[u][v]<ef[u])?resi[u][v]:ef[u];
if(p>0 && (u==s || h[u]==h[v]+1))
{
resi[u][v]-=p;resi[v][u]+=p;
ef[u]-=p;ef[v]+=p;
if(v==t) sum+=p;
if(v!=s && v!=t) Q.push(v);
}
}
if(u!=s && u!=t && ef[u]>0)
{
h[u]++;Q.push(u);
}
}
printf("%d\n",sum);
}
int main() {
int T,cas=1;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
s=1,t=n,V=n;
printf("Case %d: ",cas++);
memset(resi,0,sizeof(resi));
while(m--) {
int u,v,val;
scanf("%d%d%d",&u,&v,&val);
resi[u][v] += val;
}
push_relable();
}
return 0;
}