【最大流,dinic】P2763 试题库问题

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<stack>
  5 #include<vector>
  6 #include<map>
  7 #include<cstdio>
  8 #include<cstdlib>
  9 #include<algorithm>
 10 #include<set>
 11 #include<list>
 12 #include<iomanip>
 13 #include<cstring>
 14 #include<cmath>
 15 #include<limits>
 16 #include<cctype>
 17 using namespace std;
 18 
 19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
 20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 22 #define lll __int128
 23 #define Re register
 24 #define mem(a,b) memset(a,(b),sizeof(a))
 25 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
 26 typedef pair<int, int> intpair;
 27 typedef pair<long long int, long long int> llpair;
 28 typedef long long int ll;
 29 const int INF = 0x3f3f3f3f;
 30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
 31 
 32 const int maxn = 100010;
 33 
 34 int cnt;
 35 int n, k;
 36 
 37 struct Edge
 38 {
 39     int v, nxt;
 40     int w;
 41 }e[maxn];
 42 
 43 int head[maxn];
 44 
 45 int d[maxn];
 46 int now[maxn];
 47 int st, ed;
 48 int need[maxn];
 49 map<int, vector<int>>ser;
 50 
 51 void add_dinic(int u, int v)
 52 {
 53     e[++cnt].v = v;
 54     e[cnt].w = 0;
 55     e[cnt].nxt = head[u];
 56     head[u] = cnt;
 57 }
 58 
 59 int dfs_dinic(int x, int flow)
 60 {
 61     if (x == ed) return flow;
 62     int res = 0;
 63     for (int i = now[x]; i != -1; i = e[i].nxt)
 64     {
 65         int v = e[i].v;
 66         now[x] = i;
 67         if (d[v] + 1 == d[x] && e[i].w > 0)
 68         {
 69             int k = dfs_dinic(v, min(e[i].w, flow));
 70             if (k > 0 && x != st)
 71             {
 72                 //debug(x << " " << v - n);
 73                 ser[v - n].push_back(x);
 74             }
 75             res += k;
 76             flow -= k;
 77             e[i].w -= k;
 78             e[i ^ 1].w += k;
 79             if (!flow) break;
 80         }
 81     }
 82     return res;
 83 }
 84 
 85 bool bfs_dinic()
 86 {
 87     memset(d, 0, sizeof(d));
 88     queue<int>q;
 89     q.push(ed);
 90     d[ed] = 1;
 91     while (!q.empty())
 92     {
 93         int u = q.front();
 94         q.pop();
 95         for (int i = head[u]; i != -1; i = e[i].nxt)
 96         {
 97             int v = e[i].v;
 98             if (!d[v] && e[i ^ 1].w > 0)
 99             {
100                 q.push(v);
101                 d[v] = d[u] + 1;
102             }
103         }
104     }
105     return d[st] > 0;
106 }
107 
108 
109 int dinic()
110 {
111     int flow = 0;
112     while (bfs_dinic())
113     {
114         for (int i = 0; i <= ed; i++) now[i] = head[i];
115         flow += dfs_dinic(st, INF);
116     }
117     return flow;
118 }
119 
120 inline void init()
121 {
122     memset(head, -1, sizeof(head));
123 }
124 
125 void add(int u, int v,int w)
126 {
127     e[++cnt].v = v;
128     e[cnt].nxt = head[u];
129     head[u] = cnt;
130     e[cnt].w = w;
131     add_dinic(v, u);
132 }
133 
134 int main()
135 {
136     Design;
137     cin >> k >> n;
138     st = maxn - 2;
139     ed = maxn - 1;
140     cnt = 1;
141     init();
142     mfor(i, 1, k) cin >> need[i], add(i + n, ed, need[i]);
143     mfor(i, 1, n)
144     {
145         add(st, i, 1);
146         int p;
147         cin >> p;
148         mfor(j, 1, p)
149         {
150             int t;
151             cin >> t;
152             add(i, t + n, 1);
153         }
154     }
155     dinic();
156     mfor(i, 1, k)
157     {
158         if (ser[i].size() < need[i])
159         {
160             cout << "No Solution!" << endl;
161             return 0;
162         }
163     }
164     mfor(i, 1, k)
165     {
166         cout << i << ": ";
167         mfor(j, 0, need[i] - 1)
168         {
169             cout << ser[i][j] << " ";
170         }
171         cout << endl;
172     }
173     return 0;
174 }
View Code

 

posted on 2019-11-26 19:32  thjkhdf12  阅读(97)  评论(0)    收藏  举报