USACO 5.4 Telecowmunication(最大流+枚举)

面对最小割之类的题目,完全木想法。。。

枚举+最大流。。复杂度很大了。。。居然很快的就过了。。

  1 /*
  2 ID: cuizhe
  3 LANG: C++
  4 TASK: telecow
  5 */
  6 #include <cstring>
  7 #include <cstdio>
  8 #include <queue>
  9 #include <algorithm>
 10 using namespace std;
 11 #define INF 0xffffff
 12 struct node
 13 {
 14     int u,v,w,next;
 15 } edge[10001];
 16 int first[1001],flag[1001],dis[1001];
 17 int qu[2001],qv[2001];
 18 int t,n,m,ans;
 19 int sv,ev;
 20 void CL()
 21 {
 22     t = 0;
 23     memset(first,-1,sizeof(first));
 24 }
 25 void add(int u,int v,int w)
 26 {
 27     edge[t].u = u;
 28     edge[t].v = v;
 29     edge[t].w = w;
 30     edge[t].next = first[u];
 31     first[u] = t ++;
 32 
 33     edge[t].u = v;
 34     edge[t].v = u;
 35     edge[t].w = 0;
 36     edge[t].next = first[v];
 37     first[v] = t ++;
 38 }
 39 void build()
 40 {
 41     int i;
 42     CL();
 43     for(i = 0; i < m; i ++)
 44     {
 45         add(qu[i]+n,qv[i],INF);
 46         add(qv[i]+n,qu[i],INF);
 47     }
 48     for(i = 1; i <= n; i ++)
 49     {
 50         if(!flag[i])
 51         {
 52             if(i == sv)
 53                 add(i,i+n,INF);
 54             else if(i == ev)
 55                 add(i,i+n,INF);
 56             else
 57                 add(i,i+n,1);
 58         }
 59     }
 60 }
 61 int bfs()
 62 {
 63     int u,v,i;
 64     memset(dis,-1,sizeof(dis));
 65     queue<int> que;
 66     que.push(sv);
 67     dis[sv] = 0;
 68     while(!que.empty())
 69     {
 70         u = que.front();
 71         que.pop();
 72         for(i = first[u]; i != -1; i = edge[i].next)
 73         {
 74             v = edge[i].v;
 75             if(edge[i].w > 0&&dis[v] < 0)
 76             {
 77                 dis[v] = dis[u] + 1;
 78                 que.push(v);
 79             }
 80         }
 81     }
 82     if(dis[ev] > 0) return 1;
 83     else return 0;
 84 }
 85 int dfs(int u,int step)
 86 {
 87     int i,a = 0,v;
 88     if (u == ev) return step;
 89     for (i = first[u]; i != -1; i = edge[i].next)
 90     {
 91         v = edge[i].v;
 92         if (edge[i].w > 0&& dis[v] == dis[u]+1&&(a = dfs(v,min(step,edge[i].w))))
 93         {
 94             edge[i].w -= a;
 95             edge[i^1].w += a;
 96             return a;
 97         }
 98     }
 99     return 0;
100 }
101 int dinic()
102 {
103     int res,ans = 0;
104     while(bfs())
105     {
106         while(res = dfs(sv,INF))
107             ans+= res ;
108     }
109     return ans;
110 }
111 void path(int x)
112 {
113     int i;
114     if(x == 0) return ;
115     for(i = 1; i <= n; i ++)
116     {
117         if(flag[i] == 1) continue;
118         if(i == sv||i == ev) continue;
119         flag[i] = 1;
120         build();
121         if(dinic() == x-1)
122         {
123             if(x == ans)
124                 printf("%d",i);
125             else
126                 printf(" %d",i);
127             path(x-1);
128             return ;
129         }
130         else
131             flag[i] = 0;
132     }
133     return ;
134 }
135 int main()
136 {
137     int i;
138     freopen("telecow.in","r",stdin);
139     freopen("telecow.out","w",stdout);
140     scanf("%d%d%d%d",&n,&m,&sv,&ev);
141     for(i = 0; i < m; i ++)
142     {
143         scanf("%d%d",&qu[i],&qv[i]);
144     }
145     build();
146     printf("%d
",ans = dinic());
147     path(ans);
148     printf("
");
149     return 0;
150 }
原文地址:https://www.cnblogs.com/naix-x/p/3268076.html