「luogu2763」试题库问题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1050,K=30,oo=1e9;
 4 int k,n,ss,tt,cnt[K];
 5 struct Edge{
 6     int from,to,flow,cap;
 7     Edge(int _from=0,int _to=0,int _flow=0,int _cap=0):from(_from),to(_to),flow(_flow),cap(_cap){}
 8 };
 9 vector<int>res[K];
10 vector<Edge> edge;
11 int edge_tot;
12 vector<int>point[N];
13 void add_edge(int f,int t,int c){
14     edge.push_back(Edge(f,t,0,c));
15     point[f].push_back(edge_tot++);
16     edge.push_back(Edge(t,f,0,0));
17     point[t].push_back(edge_tot++);
18     return;
19 }
20 int level[N];
21 bool bfs(){
22     memset(level,0,sizeof(level));
23     queue<int>q;
24     q.push(ss);
25     level[ss]=1;
26     int x;
27     while(!q.empty()){
28         x=q.front();q.pop();
29         for(int i=0;i<point[x].size();i++){
30             Edge& e=edge[point[x][i]];
31             if(e.cap>e.flow&&!level[e.to]){
32                 level[e.to]=level[x]+1;
33                 q.push(e.to);
34             }
35         }
36     }
37     return level[tt];
38 }
39 int dfs(int k,int aa){
40     if(k==tt||!aa) return aa;
41     int temp,ans=0;
42     for(int i=0;i<point[k].size();i++){
43         Edge& e=edge[point[k][i]];
44         if(e.cap>e.flow&&level[e.to]==level[k]+1&&(temp=dfs(e.to,min(aa,e.cap-e.flow)))){
45             ans+=temp,aa-=temp;
46             e.flow+=temp,edge[point[k][i]^1].flow-=temp;
47         }
48         if(!aa) return ans;
49     }
50     return ans;
51 }
52 int dinic(){
53     int ans=0;
54     while(bfs()) ans+=dfs(ss,oo);
55     return ans;
56 }
57 int main(){
58     int t1,t2;
59     scanf("%d%d",&k,&n);
60     ss=k+n+1,tt=ss+1;
61     for(int i=1;i<=k;i++){
62         scanf("%d",&cnt[i]);
63         add_edge(n+i,tt,cnt[i]);
64     }
65     for(int i=1;i<=n;i++) add_edge(ss,i,1);
66     for(int i=1;i<=n;i++){
67         scanf("%d",&t1);
68         for(int j=1;j<=t1;j++){
69             scanf("%d",&t2);
70             add_edge(i,t2+n,1);
71         }
72     }
73     dinic();
74     for(int i=1;i<=k;i++){
75         if(edge[(i-1)<<1].cap>edge[(i-1)<<1].flow){
76             printf("No Solution!");
77             return 0;
78         }
79     }
80     for(int i=1;i<=n;i++)
81         for(int j=0;j<point[i].size();j++){
82             if(edge[point[i][j]].flow==1){
83                 res[edge[point[i][j]].to-n].push_back(i);
84                 break;
85             }
86         }
87     for(int i=1;i<=k;i++){
88         printf("%d:",i);
89         for(int j=0;j<res[i].size();j++) printf("%d ",res[i][j]);
90         printf("\n");
91     }
92     return 0;
93 }

 

posted @ 2018-03-08 13:15  Cupcake  阅读(120)  评论(0编辑  收藏  举报