• 网络流最小割 POJ 3469


    题意  2个CPU n个任务 给出在第一个 第二个运行时的花费

    m  个  a  b 不在同一个CPU运行的额外花费

    建图 源点 ->   n    -> 汇点

    权          a1          b1

    反向边权 0;

    还有  a->b   权 w;

    不知道 为什么b->a 权也是w  

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<string.h>
      4 #include<queue>
      5 
      6 using namespace std;
      7 
      8 int n,m;
      9 int S,T,cnt;
     10 #define inf 100000000
     11 #define MAXN 20000
     12 #define MAXN1 250000
     13 int head[MAXN+10];
     14 int vis[MAXN+10];
     15 
     16 struct edg
     17 {
     18     int to,next,w;
     19 }x[MAXN1*2];
     20 
     21 void add(int u,int v,int w)
     22 {
     23     x[cnt].next=head[u];
     24     x[cnt].to=v;
     25     x[cnt].w=w;
     26     head[u]=cnt++;
     27 }
     28 int bfs()
     29 {
     30     queue<int>q1;
     31     memset(vis,-1,sizeof(vis));
     32     vis[S]=0;
     33     q1.push(S);
     34 
     35     while(!q1.empty())
     36     {
     37         int now=q1.front();
     38         q1.pop();
     39         int j;
     40 
     41         for(j=head[now];j!=-1;j=x[j].next)
     42         {
     43             if(vis[x[j].to]<0&&x[j].w)
     44             {
     45                 vis[x[j].to]=vis[now]+1;
     46                 q1.push(x[j].to);
     47             }
     48         }
     49     }
     50     return vis[T]!=-1;
     51 
     52 }
     53 int dfs(int u,int w)
     54 {
     55     int ans=0;
     56     if(u==T)
     57         return w;
     58     int j;
     59     for(j=head[u];j!=-1;j=x[j].next)
     60     {
     61         if(vis[x[j].to]==vis[u]+1&&x[j].w)
     62         {
     63             int b=dfs(x[j].to,min(w-ans,x[j].w));
     64             x[j].w-=b;
     65             x[j^1].w+=b;
     66             ans+=b;
     67         }
     68     }
     69     return ans;
     70 }
     71 
     72 int main()
     73 {
     74 
     75     while(scanf("%d%d",&n,&m)!=EOF)
     76     {
     77         int i;
     78         memset(head,-1,sizeof(head));
     79         cnt=0;
     80         S=0;
     81         T=n+1;
     82 
     83         for(i=1;i<=n;i++)
     84         {
     85             int a,b;
     86             scanf("%d%d",&a,&b);
     87             add(S,i,a),add(i,S,0);
     88             add(i,T,b),add(T,i,0);
     89         }
     90         for(i=1;i<=m;i++)
     91         {
     92             int a,b,w;
     93             scanf("%d%d%d",&a,&b,&w);
     94             add(a,b,w),add(b,a,w);
     95         }
     96         int ans=0;
     97         while(bfs())
     98             ans+=dfs(S,inf);
     99         printf("%d
    ",ans);
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    带轮播图、导航栏、商品的简单html,以及轮播图下边数字随轮播图的改变而改变
    设计table表格,用js设计偶数行和奇数行显示不同的颜色
    用js实现九九乘法口诀两种方式
    [FW]修复ubutnu12.04+win7的grub2引导
    How to compile Linux kernel in fedora 6
    [Fw]初探linux中断系统(2)
    [Fw]初探linux中断系统(1)
    Regular Expression 範例
    [fw]IDT表的初始化
    [Fw]中断的初始化
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6054296.html
Copyright © 2020-2023  润新知