啊,第一滴血,网络流
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
struct point
{
int c;
int f;
}a[18][18];
vector<point> v[20];
queue<int> q;
int n,m;
int vis[25];
int maxflow;
int pre[25];
int augment;
void find_path()
{
int t;
augment=inf;
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
int i,j;
vis[1]=1;
q.push(1);
while(q.size())
{
t=q.front();
q.pop();
for(i=1;i<=n;i++)
{
if(vis[i]==0&&a[t][i].c)
{
augment=min(augment,a[t][i].c);
pre[i]=t;
q.push(i);
vis[i]=1;
}
}
}
return ;
}
void update_maxflow()
{
int s=n;
maxflow+=augment;
while(pre[s])
{
a[pre[s]][s].c-=augment;
a[s][pre[s]].c+=augment;
s=pre[s];
}
return ;
}
void solve()
{
maxflow = 0;
int i,j;
while(1)
{
find_path();
if(augment==inf||pre[n]==0) //没写pre[n]==0,tle了几发,而且不加是错的
{
break;
}
update_maxflow();
}
return ;
}
int main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
for(int kase=1;kase<=t;kase++)
{
memset(a,0,sizeof(a));
cin>>n>>m;
int i,j;
int x,y,z;
for(i=0;i<m;i++)
{
cin>>x>>y>>z;
a[x][y].c+=z;
}
solve();
cout<<"Case "<<kase<<": ";
cout<<maxflow<<endl;
}
}