啊。。。vis要memset。。。。
dinic.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxv 1050 #define maxe 15500 #define inf 1000000007 using namespace std; struct edge { int v,f,nxt; }e[maxe]; int n,nume=1,a,b,c,s,t,g[maxv],dis[maxv]; queue <int> q; bool vis[maxv]; char ss[4]; void addedge(int u,int v,int w) { e[++nume].v=v; e[nume].f=w; e[nume].nxt=g[u]; g[u]=nume; e[++nume].v=u; e[nume].f=0; e[nume].nxt=g[v]; g[v]=nume; } bool bfs() { memset(dis,0,sizeof(dis)); memset(vis,false,sizeof(vis)); q.push(s);vis[s]=true; while (!q.empty()) { int head=q.front(); q.pop(); for (int i=g[head];i;i=e[i].nxt) { int v=e[i].v; if ((vis[v]==false) && (e[i].f>0)) { vis[v]=true;dis[v]=dis[head]+1; q.push(v); } } } if (dis[t]==0) return false; return true; } int dinic(int x,int low) { if (x==t) return low; else { int ret=0; for (int i=g[x];low && i;i=e[i].nxt) { int v=e[i].v; if ((dis[v]==dis[x]+1) && (e[i].f>0)) { int dd=dinic(v,min(low,e[i].f)); low-=dd;ret+=dd;e[i].f-=dd;e[i^1].f+=dd; } } if (ret==0) dis[x]=0; return ret; } } int max_flow() { int ret=0; while (bfs()) ret+=dinic(s,inf); return ret; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%s",ss);a=ss[0]; scanf("%s",ss);b=ss[0]; scanf("%d",&c); addedge(a,b,c); } s=65;t=90; printf("%d\n",max_flow()); return 0; }