是道绿题???二分图(网络流)不应该是蓝打底???
这题浏览一遍就知道是二分图(网络流)算法喽,二分图代码太短,不想写(←这人???),所以就拿网络流练练手。
设源点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(" ") 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),哈哈…………嗝