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 }
  • 相关阅读:
    scala学习资料
    maven安装scala插件
    关于 mod_python
    Python读取Excel数据
    Python展开一个嵌套的序列
    随手写的Java向文本文件写字符串的类
    Python三元表达式
    递归的概述
    一分钟让你明白CSS中的盒模型
    Python实现ID3算法
  • 原文地址:https://www.cnblogs.com/mycups/p/8527855.html
Copyright © 2011-2022 走看看