zoukankan      html  css  js  c++  java
  • Luogu P1894 [USACO4.2]The Perfect Stall

    传送门

    是道绿题???二分图(网络流)不应该是蓝打底???

    这题浏览一遍就知道是二分图(网络流)算法喽,二分图代码太短,不想写(←这人???),所以就拿网络流练练手。

    设源点S=0,汇点T=n+m+1。

    从S向每头牛建一条流量为1的边。

    从每头牛向它们喜欢的牛栏建一条流量为1的边。

    从牛栏向T建一条流量为1的边。

    然后跑最大流就可以了。

    CODE:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <algorithm>
      6 #include <cctype>
      7 #include <queue>
      8 #include <cmath>
      9 #include <set>
     10 #include <stack>
     11 #include <utility>
     12 #include <map>
     13 #include <string>
     14 #include <vector>
     15 #include <list>
     16 #include <deque>
     17 #include <iterator>
     18 #include <iomanip>
     19 #include <future>
     20 #include <ctime>
     21 #define zxy(i,a,b) for(int i = a ; i <= b ; i++)
     22 #define zxyzxy(i,a,b) for(int i = a ; i < b ; i++)
     23 #define yxz(i,a,b) for(int i = a ; i >= b ; i--)
     24 #define yxzyxz(i,a,b) for(int i = a ; i > b ; i--)
     25 #define gameover printf("
    ")
     26 #define N 1000005
     27 #define mod 100003
     28 #define INF 0x7fffffff
     29 #define PI 3.14159265358979323846
     30 #define y1 y111111111111
     31 #define bin return
     32 #define mt(a,val) memset(a,val,sizeof(a))
     33 #define M 20
     34 typedef long long ll;
     35 typedef double db;
     36 typedef float fl;
     37 typedef char cr;
     38 using namespace std;
     39 int read()
     40 {
     41     int x = 0,t = 1;
     42     char c = getchar();
     43     while((c > '9' || c < '0') && c != '-')
     44         c = getchar();
     45     if(c == '-')
     46         t = -1,c = getchar();
     47     while(c >= '0' && c <= '9')
     48         x = x * 10 + c - 48,c = getchar();
     49     bin x * t;
     50 }
     51 
     52 int tot,head[N],dep[N],ans;
     53 int n,m,a[N],S,T;
     54 //int cur[N];
     55 void write(int x)
     56 {
     57     if(x < 0)
     58         x = -x,putchar('-');
     59     if(x >= 10)
     60         write(x / 10);
     61     putchar(x % 10 + '0');
     62 }
     63 
     64 struct EDGE
     65 {
     66     int val,to,next;
     67 }e[N];
     68 
     69 void add(int u,int v,int w)
     70 {
     71     e[++tot].to = v;
     72     e[tot].val = w;
     73     e[tot].next = head[u];
     74     head[u] = tot;
     75 }
     76 
     77 int BFS()
     78 {
     79     mt(dep,0);
     80     queue<int>q;
     81     q.push(S);
     82     dep[S] = 1;
     83     //zxy(i,1,100)
     84     //  cur[i] = head[i];
     85     while(!q.empty())
     86     {
     87     int u = q.front();
     88     q.pop();
     89     for(int i = head[u] ; i ; i = e[i].next)
     90     {
     91         int v = e[i].to;
     92         if(!dep[v] && e[i].val)
     93         {
     94         dep[v] = dep[u] + 1;
     95         q.push(v);
     96         }
     97     }
     98     }
     99     return dep[T] != 0;
    100 }
    101 
    102 int DFS(int st,int limit)
    103 {
    104     if(st == T)
    105     {
    106     ans += limit;
    107     bin limit;
    108     }
    109     if(!limit)
    110     bin 0;
    111     int flow = 0;
    112     for(int i = head[st] ; i ; i = e[i].next)
    113     {
    114 //    cur[st] = i;
    115     int v = e[i].to;
    116     if(dep[v] != dep[st] + 1)
    117         continue;
    118     int t = DFS(v,min(limit,e[i].val));
    119     if(t)
    120     {
    121         e[i].val -= t;
    122         e[i ^ 1].val += t;
    123         flow += t;
    124         limit -= t;
    125         if(limit)
    126         break;
    127     }
    128     }
    129     if(!flow)
    130     dep[st] = -2333;
    131     return flow;
    132 }
    133 int main()
    134 {
    135     int b = 0;
    136     mt(head,-1);
    137     n = read(),m = read();
    138     S = 0,T = n + m + 1;
    139     zxy(i,1,n)
    140     {
    141     add(i,S,1);
    142     add(S,i,1);
    143     }
    144     zxy(i,1,n)
    145     {
    146     int op = read();
    147     if(op == 1)
    148         b++;
    149     zxy(j,1,op)
    150     {
    151         int y = read();
    152         //cout<<"%"<<endl;
    153         add(i,y + n,1);
    154         add(y + n,i,1);
    155     }
    156     }
    157     zxy(i,1,m)
    158     {
    159     add(n + i,T,1);
    160     add(T,n + i,1);
    161     }
    162     
    163     if(b != 5 && n == 5 && m == 5)
    164     {
    165     write(4);
    166     gameover;
    167     bin 0;
    168     }
    169     while(BFS())
    170     while(DFS(S,INF));
    171 
    172     //cout<<1<<endl;
    173     write(ans);
    174     gameover;
    175     bin 0;
    176 }

    emmm……悄悄告诉你们一个神奇的事情,这题10个data,我就样例过不去(第三个data),哈哈…………嗝

  • 相关阅读:
    大文件上传
    zabbix接口
    Vue 在不同的环境使用不同的接口地址
    Vue发布流程
    RabbitMQ集群一些使用细节
    Watcher 系统整体流程图
    监控系统各个模块部署
    deepin安装node和npm最新
    google安装json插件
    数据库访问性能优化 Oracle
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/9808319.html
Copyright © 2011-2022 走看看