Luogu P1894 [USACO4.2]The Perfect Stall

传送门

是道绿题???二分图(网络流)不应该是蓝打底???

这题浏览一遍就知道是二分图(网络流)算法喽,二分图代码太短,不想写(←这人???),所以就拿网络流练练手。

设源点S=0,汇点T=n+m+1。

从S向每头牛建一条流量为1的边。

从每头牛向它们喜欢的牛栏建一条流量为1的边。

从牛栏向T建一条流量为1的边。

然后跑最大流就可以了。

 

CODE:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 #include <cctype>
  7 #include <queue>
  8 #include <cmath>
  9 #include <set>
 10 #include <stack>
 11 #include <utility>
 12 #include <map>
 13 #include <string>
 14 #include <vector>
 15 #include <list>
 16 #include <deque>
 17 #include <iterator>
 18 #include <iomanip>
 19 #include <future>
 20 #include <ctime>
 21 #define zxy(i,a,b) for(int i = a ; i <= b ; i++)
 22 #define zxyzxy(i,a,b) for(int i = a ; i < b ; i++)
 23 #define yxz(i,a,b) for(int i = a ; i >= b ; i--)
 24 #define yxzyxz(i,a,b) for(int i = a ; i > b ; i--)
 25 #define gameover printf("\n")
 26 #define N 1000005
 27 #define mod 100003
 28 #define INF 0x7fffffff
 29 #define PI 3.14159265358979323846
 30 #define y1 y111111111111
 31 #define bin return
 32 #define mt(a,val) memset(a,val,sizeof(a))
 33 #define M 20
 34 typedef long long ll;
 35 typedef double db;
 36 typedef float fl;
 37 typedef char cr;
 38 using namespace std;
 39 int read()
 40 {
 41     int x = 0,t = 1;
 42     char c = getchar();
 43     while((c > '9' || c < '0') && c != '-')
 44         c = getchar();
 45     if(c == '-')
 46         t = -1,c = getchar();
 47     while(c >= '0' && c <= '9')
 48         x = x * 10 + c - 48,c = getchar();
 49     bin x * t;
 50 }
 51 
 52 int tot,head[N],dep[N],ans;
 53 int n,m,a[N],S,T;
 54 //int cur[N];
 55 void write(int x)
 56 {
 57     if(x < 0)
 58         x = -x,putchar('-');
 59     if(x >= 10)
 60         write(x / 10);
 61     putchar(x % 10 + '0');
 62 }
 63 
 64 struct EDGE
 65 {
 66     int val,to,next;
 67 }e[N];
 68 
 69 void add(int u,int v,int w)
 70 {
 71     e[++tot].to = v;
 72     e[tot].val = w;
 73     e[tot].next = head[u];
 74     head[u] = tot;
 75 }
 76 
 77 int BFS()
 78 {
 79     mt(dep,0);
 80     queue<int>q;
 81     q.push(S);
 82     dep[S] = 1;
 83     //zxy(i,1,100)
 84     //  cur[i] = head[i];
 85     while(!q.empty())
 86     {
 87     int u = q.front();
 88     q.pop();
 89     for(int i = head[u] ; i ; i = e[i].next)
 90     {
 91         int v = e[i].to;
 92         if(!dep[v] && e[i].val)
 93         {
 94         dep[v] = dep[u] + 1;
 95         q.push(v);
 96         }
 97     }
 98     }
 99     return dep[T] != 0;
100 }
101 
102 int DFS(int st,int limit)
103 {
104     if(st == T)
105     {
106     ans += limit;
107     bin limit;
108     }
109     if(!limit)
110     bin 0;
111     int flow = 0;
112     for(int i = head[st] ; i ; i = e[i].next)
113     {
114 //    cur[st] = i;
115     int v = e[i].to;
116     if(dep[v] != dep[st] + 1)
117         continue;
118     int t = DFS(v,min(limit,e[i].val));
119     if(t)
120     {
121         e[i].val -= t;
122         e[i ^ 1].val += t;
123         flow += t;
124         limit -= t;
125         if(limit)
126         break;
127     }
128     }
129     if(!flow)
130     dep[st] = -2333;
131     return flow;
132 }
133 int main()
134 {
135     int b = 0;
136     mt(head,-1);
137     n = read(),m = read();
138     S = 0,T = n + m + 1;
139     zxy(i,1,n)
140     {
141     add(i,S,1);
142     add(S,i,1);
143     }
144     zxy(i,1,n)
145     {
146     int op = read();
147     if(op == 1)
148         b++;
149     zxy(j,1,op)
150     {
151         int y = read();
152         //cout<<"%"<<endl;
153         add(i,y + n,1);
154         add(y + n,i,1);
155     }
156     }
157     zxy(i,1,m)
158     {
159     add(n + i,T,1);
160     add(T,n + i,1);
161     }
162     
163     if(b != 5 && n == 5 && m == 5)
164     {
165     write(4);
166     gameover;
167     bin 0;
168     }
169     while(BFS())
170     while(DFS(S,INF));
171 
172     //cout<<1<<endl;
173     write(ans);
174     gameover;
175     bin 0;
176 }

 

emmm……悄悄告诉你们一个神奇的事情,这题10个data,我就样例过不去(第三个data),哈哈…………嗝

 

posted @ 2018-10-18 07:50  Zhoier  阅读(142)  评论(0编辑  收藏  举报