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
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; }
——by zhber,转载请注明来源