标签:
神奇的模板...总之各种各样的模板整理...已经准备用我现在的码风重新打一遍了...
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<queue> 5 #include<iostream> 6 using namespace std; 7 8 const int INF = 0x7fffffff; 9 const int N = 505; 10 const int M = 805; 11 12 inline int in(int x=0,char ch=getchar()){ while(ch>‘9‘||ch<‘0‘) ch=getchar(); 13 while(ch>=‘0‘&&ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x; } 14 struct NetWork{ 15 int n,m,s,t; 16 struct Edge{ int fr,to,flow; }edge[M<<1];int cnte; 17 vector<int> g[N];int flow; 18 int num[N],cur[N],d[N],p[N];bool v[N]; 19 20 21 void Add_Edge(int fr,int to,int fl){ 22 edge[cnte++]=(Edge){ fr,to,fl },edge[cnte++]=(Edge){ to,fr,0 }; 23 g[fr].push_back(cnte-2),g[to].push_back(cnte-1); 24 } 25 int Add_Flow(){ 26 int a=INF; 27 for(int x=t;x!=s;x=edge[p[x]].fr) a=min(a,edge[p[x]].flow); 28 for(int x=t;x!=s;x=edge[p[x]].fr) edge[p[x]].flow-=a,edge[p[x]^1].flow+=a; 29 return a; 30 } 31 void BFS(){ 32 for(int i=1;i<=n;i++) d[i]=n; 33 memset(v,0,sizeof(v)); 34 queue<int> q;q.push(t),v[t]=1,d[t]=0; 35 for(int x;!q.empty();){ 36 x=q.front(),q.pop(); 37 for(int i=0,lim=g[x].size();i<lim;i++){ 38 Edge &e=edge[g[x][i]]; 39 Edge &u=edge[g[x][i]^1]; 40 if(!v[e.to]&&u.flow) d[e.to]=d[x]+1,v[e.to]=1,q.push(e.to); 41 } 42 } 43 } 44 int ISAP(){ 45 BFS();int flow=0; 46 memset(num,0,sizeof(num)),memset(cur,0,sizeof(cur)); 47 for(int i=1;i<=n;i++) num[d[i]]++; 48 for(int x=s,ok;d[s]<n;){ 49 if(x==t) flow+=Add_Flow(),x=s;ok=0; 50 for(int &i=cur[x],lim=g[x].size();i<lim;i++){ 51 Edge &e=edge[g[x][i]]; 52 if(e.flow&&d[x]==d[e.to]+1){ 53 ok=1,p[e.to]=g[x][i],x=e.to;break; 54 } 55 } 56 if(!ok){ 57 int tmp=n-1; 58 for(int i=0,lim=g[x].size();i<lim;i++) tmp=min(tmp,d[edge[g[x][i]].to]); 59 if(!(--num[d[x]])) break;num[d[x]=m+1]++,cur[x]=0; 60 if(x!=s) x=edge[p[x]].fr; 61 } 62 }return flow; 63 } 64 }isap; 65 int main(){ return 0; }
标签:
原文地址:http://www.cnblogs.com/beiyuoi/p/5770820.html