Cable TV Network, ACM/ICPC SEERC 2004, UVa1660【Dinic 最小割 拆点】

来源:互联网 发布:华为软件研发面试经验 编辑:程序博客网 时间:2024/05/16 06:10
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<vector>#include<queue>using namespace std;typedef long long ll;const int maxn = 102;int n,m;struct edge{int to,cap,next;};vector<edge> E;vector<edge> bak;int head[maxn],S,T,cur[maxn],d[maxn];const int INF = 0x3f3f3f3f;#define PB(x) push_back(x)void adde(int u,int v,int c){edge x = {v,c,head[u]};bak.PB(x);head[u] = bak.size()-1;x = {u,0,head[v]};bak.PB(x);head[v] = bak.size()-1;}bool bfs(){memset(d,0,sizeof(d));queue<int> q;q.push(S);d[S]=1;while(!q.empty()){int u = q.front();q.pop();for(int i=head[u];~i;i=E[i].next){int v = E[i].to;if(!d[v]&&E[i].cap>0){d[v] = d[u] + 1;q.push(v);}}}return d[T];}int dfs(int u,int a){if(u==T||a==0)return a;int flow = 0,f;for(int& i= cur[u];~i;i=E[i].next){edge& e = E[i];if(d[e.to]==d[u]+1&&(f=dfs(e.to,min(a,e.cap)))>0){E[i].cap-=f;E[i^1].cap+=f;a-=f;flow+=f;if(a==0)break;}}return flow;}int MaxFlow(){int flow = 0;while(bfs()){memcpy(cur,head,sizeof(head));flow+=dfs(S,INF);}return flow;}int main(void){while(~scanf("%d%d",&n,&m)){memset(head,-1,sizeof(head));bak.clear();for(int i=1;i<n;i++)adde(i,i+n,1);for(int i=0;i<m;i++){int u,v;scanf(" (%d,%d)",&u,&v);adde(u+n,v,INF);adde(v+n,u,INF);}int ans = n;S = n;for(T=1;T<n;T++){E = bak;ans = min(ans,MaxFlow());}printf("%d\n",ans);}return 0;}

1 0
原创粉丝点击