zoukankan      html  css  js  c++  java
  • 「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("
    ");
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/mycups/p/8527855.html
Copyright © 2011-2022 走看看