您的位置:首页 > 其它

bzoj3396 [Usaco2009 Jan]Total flow 水流

2014-07-07 20:54 281 查看

Description





Input

第1行输入N,之后N行每行描述一条水管,前两个英文字母表示水管的两端(大小写字母是不一样的),后一个整数表示水管的流量,流量不会超过1000.

Output

一个整数,表示总流量.

Sample Input

5

A B 3

B C 3

C D 5

D Z 4

B Z 6

Sample Output

3

我完全不知道这题在讲什么……不就是网络流吗……为什么讲这么多

A是源Z是汇,跑一遍网络流乱搞就AC了

#include<cstdio>
#include<iostream>
#include<cstring>
#define S 1
#define T 26
#define inf 0x7fffffff
using namespace std;
struct edge{
int to,next,v;
}e[50001];
int n,cnt=1,ans;
int head[10001];
int h[10001];
int q[10001];
inline void ins(int u,int v,int w)
{
e[++cnt].v=w;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void insert(int u,int v,int w)
{
ins(u,v,w);
ins(v,u,0);
}inline bool bfs()
{
memset(h,-1,sizeof(h));
int t=0,w=1;
q[1]=S;h[S]=0;
while (t<w)
{
int now=q[++t];
for (int j=head[now];j;j=e[j].next)
{
if (e[j].v&&h[e[j].to]==-1)
{
q[++w]=e[j].to;
h[e[j].to]=h[now]+1;
}
}
}
if (h[T]==-1) return 0;
return 1;
}
inline int dfs(int x,int f)
{
if (x==T||f==0) return f;
int w,used=0;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].v&&h[e[i].to]==h[x]+1)
{
w=used;
w=dfs(e[i].to,min(e[i].v,f-used));
e[i].v-=w;
e[i^1].v+=w;
used+=w;
if (used==f) return f;
}
}
if (!used) h[x]==-1;
return used;
}
inline void dinic()
{while (bfs()) ans+=dfs(S,inf);}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
char a,b;
int c;
cin>>a>>b>>c;
insert(a-'A'+1,b-'A'+1,c);
}
dinic();
cout<<ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: