zoukankan      html  css  js  c++  java
  • POJ

    题目链接 : POJ1149

    画出最初的模型,想办法化简。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <vector>
      5 #include <iostream>
      6 #include <queue>
      7 using namespace std;
      8 #define next Next
      9 const int inf = 0x3f3f3f3f;
     10 const int maxn=205;
     11 int level[maxn];
     12 int iter[maxn];
     13 int head[maxn],tot;
     14 struct edge{
     15     int to,cap,Next;
     16 } e[20005]; ///此处应为边的两倍,加一条容量为0的反向边
     17 void init(){
     18     memset(head,-1,sizeof(head));
     19     tot=0;
     20 }
     21 void add(int from,int to,int cap){
     22     e[tot].Next=head[from];
     23     e[tot].to=to;
     24     e[tot].cap=cap;
     25     head[from]=tot;
     26     tot++;
     27 }
     28 void addedge(int from,int to,int cap){
     29     add(from,to,cap);
     30     add(to,from,0);
     31 }
     32 void bfs(int s){
     33     memset(level,-1,sizeof(level));
     34     queue<int> q;
     35     level[s]=0;
     36     q.push(s);
     37     while(!q.empty()){
     38         int v=q.front(); q.pop();
     39         for(int i=head[v];~i;i=e[i].Next){
     40             edge &ed=e[i];
     41             if(ed.cap>0&&level[ed.to]<0){
     42                 level[ed.to]=level[v]+1;
     43                 q.push(ed.to);
     44             }
     45         }
     46     }
     47 }
     48 int dfs(int v,int t,int f){
     49     if(v==t) return f;
     50     for(int &i=iter[v];~i;i=e[i].Next){
     51         edge &ed=e[i];
     52         if(ed.cap>0&&level[v]<level[ed.to]){
     53             int d=dfs(ed.to,t,min(f,ed.cap));
     54             if(d>0){
     55                 ed.cap-=d;
     56                 e[i^1].cap+=d;
     57                 return d;
     58             }
     59         }
     60     }
     61     return 0;
     62 }
     63 int max_flow(int s,int t){
     64     int flow=0;
     65     while(1){
     66         bfs(s);
     67         if(level[t]<0) return flow;
     68         memcpy(iter,head,sizeof(iter));
     69         int f;
     70         while((f=dfs(s,t,inf))>0){
     71             flow+=f;
     72         }
     73     }
     74 }
     75 
     76 vector<int> customer[1005];
     77 int pig[1005];
     78 int main()
     79 {
     80     int n,m;
     81     init();
     82     scanf("%d %d",&m,&n);
     83     int s = n+1;
     84     int t = n+2;
     85     for(int i=1;i<=m;i++) scanf("%d",&pig[i]);
     86     for(int i=1;i<=n;i++)
     87     {
     88         int a,x,b;
     89         scanf("%d",&a);
     90         for(int j=1;j<=a;j++)
     91         {
     92             scanf("%d",&x);
     93             customer[x].push_back(i);
     94         }
     95         scanf("%d",&b);
     96         addedge(i,t,b);
     97     }
     98     for(int i=1;i<=m;i++)
     99     {
    100         int tt = customer[i].size();
    101         for(int j=0;j<tt;j++)
    102         {
    103             if(j==0)
    104             {
    105                 addedge(s,customer[i][0],pig[i]);
    106             }
    107             if(j+1<tt)
    108             addedge(customer[i][j],customer[i][j+1],inf);
    109         }
    110     }
    111     int ans = max_flow(s,t);
    112     printf("%d
    ",ans);
    113     return 0;
    114 }
  • 相关阅读:
    团队作业2 需求分析与原型设计
    团队作业1
    获取公众号关注二维码url
    用户绑定公众号列表与未绑定公众号列表
    修改个人信息
    公众号登录
    idea去掉右侧小窗口代码块预览,idea去掉右侧代码预览
    微信退款 订单金额或退款金额与之前请求不一致,请核实后再试
    取消支付
    linux命令发送请求
  • 原文地址:https://www.cnblogs.com/littlepear/p/7603541.html
Copyright © 2011-2022 走看看