UVA 1660(p380)----Cable TV Network

来源:互联网 发布:淘宝代购欧时力是正品? 编辑:程序博客网 时间:2024/04/29 03:41
#include<cstdio>#include<cstring>#include<queue>#include<vector>#include<iostream>#include<algorithm>using namespace std;const int maxn = 50*50+10;const int INF = 1000000000;int n,m;vector<int> flag;struct Edge{    int from, to, cap, flow;    Edge(int a,int b,int c,int d):from(a),to(b),cap(c),flow(d) {}};vector<Edge> edge;vector<Edge> edges;vector<int> G[maxn];struct Dinic{    int n, m, s, t;    bool vis[maxn];    int d[maxn];    int cur[maxn];    void init(int n)    {        this->n=n;        for(int i = 0; i < n; i++) G[i].clear();        edges.clear();    }    void addedge(int from, int to, int cap)    {        edges.push_back(Edge(from,to,cap,0));        edges.push_back(Edge(to,from,0,0));        int m = edges.size();        G[from].push_back(m-2);        G[to].push_back(m-1);    }    bool BFS(int s)    {        memset(vis, 0, sizeof(vis));        queue<int> Q;        Q.push(s);        vis[s] = 1;        d[s] = 0;        while(!Q.empty())        {            int x = Q.front();            Q.pop();            for(int i = 0; i < G[x].size(); i++)            {                Edge& e = edge[G[x][i]];                if(!vis[e.to] && e.cap > e.flow)                {                    vis[e.to] = 1;                    d[e.to] = d[x] + 1;                    Q.push(e.to);                }            }        }        return vis[t];    }    int DFS(int x, int a)    {        if(x == t || a == 0) return a;        int flow = 0, f;        for(int& i = cur[x]; i < G[x].size(); i++)        {            Edge& e = edge[G[x][i]];            if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap-e.flow))) > 0)            {                e.flow += f;                edge[G[x][i]^1].flow -= f;                flow += f;                a -= f;                if(a == 0) break;            }        }        return flow;    }    int Maxflow(int s, int t)    {        this->s = s;        this->t = t;        int flow = 0;        while(BFS( s))        {            memset(cur, 0, sizeof(cur));            flow += DFS(s, INF);        }       // cout<<s<<" "<<t<<" "<<flow<<endl;        return flow;    }};Dinic g;int main(){    while(scanf("%d%d",&n,&m)==2)    {        g.init(2*n);        flag.clear();        for(int i=0; i<n; i++)            g.addedge(i,i+n,1);        for(int i=0; i<m; i++)        {            int u,v;            scanf(" (%d,%d)",&u,&v);            g.addedge(u+n,v,INF);            g.addedge(v+n,u,INF);            // if(u+n==n) flag.push_back(v);        }        int ans=INF;        for(int i=n-1; i>=0; i--)        {            if(i+n!=n)            {                edge=edges;                ans=min(ans,g.Maxflow(n,i));            }        }        if(ans==INF) printf("%d\n",n);        else            printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击