• poj2455Secret Milking Machine(二分+最大流)


    链接

    二分距离,小于当前距离的边容量+1,使最后流>=t 

    注意 会有重边

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 #include<vector>
      7 #include<cmath>
      8 #include<queue>
      9 #include<set>
     10 using namespace std;
     11 #define N 205
     12 #define LL long long
     13 #define INF 0xfffffff
     14 const double eps = 1e-8;
     15 const double pi = acos(-1.0);
     16 const double inf = ~0u>>2;
     17 int path[N],flow[N],gh[N][N],st,en;
     18 int w[N][N];
     19 struct node
     20 {
     21     int u,v,c;
     22 }q[N*N];
     23 int bfs()
     24 {
     25     int i;
     26     memset(path,-1,sizeof(path));
     27     for(i = 1 ; i <= en ; i++)
     28     flow[i] = INF;
     29     queue<int>q;
     30     q.push(1);
     31     while(!q.empty())
     32     {
     33         int tk = q.front();
     34         q.pop();
     35         if(tk==en)
     36         break;
     37         for(i = 1 ; i <= en ; i++)
     38         {
     39             if(path[i]==-1&&gh[tk][i])
     40             {
     41                 path[i] = tk;
     42                 flow[i] = min(flow[tk],gh[tk][i]);
     43                 q.push(i);
     44             }
     45         }
     46     }
     47     if(path[en]==-1)
     48     return -1;
     49     return flow[en];
     50 }
     51 int EK()
     52 {
     53     int now,pre,sum=0,k;
     54     while((k=bfs())!=-1)
     55     {
     56         sum+=k;
     57         now = en;
     58         while(now!=st)
     59         {
     60             pre = path[now];
     61             gh[pre][now]-=k;
     62             gh[now][pre]+=k;
     63             now = pre;
     64         }
     65     }
     66     return sum;
     67 }
     68 int main()
     69 {
     70     int n,p,i,m;
     71     while(scanf("%d%d%d",&n,&p,&m)!=EOF)
     72     {
     73         for(i = 1; i <= p ;i++)
     74         {
     75             scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].c);
     76             q[i].u++,q[i].v++;
     77         }
     78         st = 1;
     79         en = n+2;
     80         int low = 0,high = 1000000,mid;
     81         while(low<=high)
     82         {
     83             mid = (low+high)>>1;
     84             memset(gh,0,sizeof(gh));
     85             gh[st][2] = m;
     86             gh[n+1][en] = m;
     87             for(i = 1;i <= p ; i++)
     88             if(q[i].c<=mid)
     89             {
     90                 gh[q[i].u][q[i].v]+=1;
     91                 gh[q[i].v][q[i].u]+=1;
     92             }
     93             if(EK()==m)
     94             high = mid-1;
     95             else
     96             low =mid+1;
     97         }
     98         cout<<low<<endl;
     99     }
    100     return 0;
    101 }
    View Code
  • 相关阅读:
    数组,集合,泛型
    DataSet和实体,泛型集合
    数据源绑定控件的Row/ItemDataBound事件
    Access 中时间格式 yyyyMMdd HH:mm:ss
    IMG标记的alt属性和title属性详解
    后台代码(cs)中加空格
    数据绑定控件之绑定项
    数据绑定控件之DataBound事件
    DataSet,DataTable,DateView的关系和用法
    程序编程网
  • 原文地址:https://www.cnblogs.com/shangyu/p/3711374.html
Copyright © 2020-2023  润新知