P2763-试题库问题
1 #include<bits/stdc++.h> 2 #define _for(i,a,b) for(register int i = (a);i < b;i ++) 3 #define _rep(i,a,b) for(register int i = (a);i > b;i --) 4 #define INF 0x3f3f3f3f 5 #define MOD 100000000 6 #define maxn 1000003 7 #define pb push_back 8 #define debug() printf("Miku Check OK!\n") 9 typedef long long ll; 10 11 using namespace std; 12 typedef pair<int,int> P; 13 inline ll read() 14 { 15 ll ans = 0; 16 char ch = getchar(), last = ' '; 17 while(!isdigit(ch)) last = ch, ch = getchar(); 18 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 19 if(last == '-') ans = -ans; 20 return ans; 21 } 22 inline void write(ll x) 23 { 24 if(x < 0) x = -x, putchar('-'); 25 if(x >= 10) write(x / 10); 26 putchar(x % 10 + '0'); 27 } 28 int ver[maxn],Next[maxn],head[maxn],val[maxn]; 29 int d[maxn]; 30 int n,m,k,s,t,tot,maxflow; 31 const int N = 2000; 32 void add(int x,int y,int w) 33 { 34 ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = w; 35 } 36 bool bfs() 37 { 38 memset(d,0,sizeof(d)); 39 queue<int> q; 40 q.push(s);d[s] = 1; 41 while(!q.empty()) 42 { 43 int x = q.front();q.pop(); 44 for(int i = head[x]; i; i = Next[i]) 45 if(val[i] && !d[ver[i]]) 46 { 47 q.push(ver[i]); 48 d[ver[i]] = d[x]+1; 49 if(ver[i]==t) 50 return true; 51 } 52 } 53 return false; 54 } 55 int dinic(int x,int flow) 56 { 57 if(x==t) return flow; 58 // k为子节点增量 59 int rest = flow, k; 60 for(int i = head[x]; i && rest; i = Next[i]) 61 { 62 if(val[i] && d[ver[i]] == d[x]+1) 63 { 64 k = dinic(ver[i],min(rest,val[i])); 65 if(!k) d[ver[i]] = 0; 66 val[i] -= k; 67 val[i^1] += k; 68 rest -= k; 69 } 70 } 71 return flow - rest; 72 } 73 int kNeed[30]; 74 int main() 75 { 76 k = read();n = read(); 77 tot = 1;maxflow = 0;m = 0;s = 0;t = 2*N+1; 78 _for(i,1,k+1) 79 { 80 kNeed[i] = read();m += kNeed[i]; 81 add(i+N,2*N+1,kNeed[i]);add(2*N+1,i+N,0); 82 } 83 _for(i,1,n+1) 84 { 85 int d = read(); 86 _for(j,0,d) 87 { 88 int x = read(); 89 add(i,x+N,1);add(x+N,i,0); 90 } 91 add(0,i,1);add(i,0,0); 92 } 93 94 int flow = 0; 95 while(bfs()) 96 while(flow = dinic(s,INF)) 97 maxflow += flow; 98 99 if(maxflow != m) 100 { 101 printf("No Solution!\n"); 102 return 0; 103 } 104 105 _for(i,1,k+1) 106 { 107 printf("%d: ",i); 108 for(int j = head[i+N]; j ; j = Next[j]) 109 { 110 int y = ver[j]; 111 if(y < N && val[j]) 112 printf("%d ",y); 113 } 114 printf("\n"); 115 } 116 return 0; 117 }