问题:As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, decided to update their famous product - SWODNIW.

The routine consists of N modules, and each of them should run in a certain core. The costs for all the routines to execute on two cores has been estimated. Let's define them as Ai and Bi. Meanwhile, M pairs of modules need to do some data-exchange. If they are running on the same core, then the cost of this action can be ignored. Otherwise, some extra cost are needed. You should arrange wisely to minimize the total cost.

Input
There are two integers in the first line of input data, N and M (1 ≤ N ≤ 20000, 1 ≤ M ≤ 200000) .
The next N lines, each contains two integer, Ai and Bi.
In the following M lines, each contains three integers: a, b, w. The meaning is that if module a and module b don't execute on the same core, you should pay extra w dollars for the data-exchange between them.

Output
Output only one integer, the minimum total cost.

Sample Input
3 1
1 10
2 10
10 3
2 3 1000

Sample Output
13

回答:题目大意是第i个moduel在两个核的运行时间分别为ai、bi,两个modue之间的数据交换要有花费。可以将其建成一个网络流模型,源点和汇点分别是两个核,记为0,n+1,然后建图,求最小割即可。

#include<cstdio>  
    #include<cstring>  
    #include<iostream>  
    using namespace std;  
      
    const int N=20100;  
    const int M=200200;  
    const int inf=1<<29;  
    struct node  
    {  
     int v,f;  
     int next;  
    }edge[8*M];  
    int head[N],num;  
    int n,m;  
    int s,t,NN;  
      
    void init()  
    {  
     for(int i=0;i<=n+2;i++)  
      head[i]=-1;  
     num=0;  
    }  
      
    void addege(int u,int v,int f)  
    {  
     edge[num].v=v;  
     edge[num].f=f;  
     edge[num].next=head[u];  
     head[u]=num++;  
     edge[num].v=u;  
     edge[num].f=0;  
     edge[num].next=head[v];  
     head[v]=num++;  
    }  
      
    int sap()  
    {  
     int pre[N],cur[N],dis[N],gap[N];  
     int flow=0,aug=inf,u;  
     bool flag;  
     int i;  
     for(i=1;i<=NN;i++)  
     {  
      cur[i]=head[i];  
      gap[i]=dis[i]=0;  
     }  
     gap[s]=NN;  
     u=pre[s]=s;  
     while(dis[s]<NN)  
     {  
      flag=0;  
      for(int &j=cur[u];j!=-1;j=edge[j].next)  
      {  
       int v=edge[j].v;  
       if(edge[j].f>0 && dis[u]==dis[v]+1)  
       {  
        flag=1;  
        if(edge[j].f<aug) aug=edge[j].f;  
        pre[v]=u;  
        u=v;  
        if(u==t)  
        {  
         flow+=aug;  
         while(u!=s)  
         {  
          u=pre[u];  
          edge[cur[u]].f-=aug;  
          edge[cur[u]^1].f+=aug;  
         }  
         aug=inf;  
        }  
        break;  
       }  
      }  
      if(flag) continue;  
      int mindis=NN;  
      for(int j=head[u];j!=-1;j=edge[j].next)  
      {  
       int v=edge[j].v;  
       if(edge[j].f>0 && dis[v]<mindis)  
       {  
        mindis=dis[v];  
        cur[u]=j;  
       }  
      }  
      if((--gap[dis[u]])==0) break;  
      gap[dis[u]=mindis+1]++;  
      u=pre[u];  
     }  
     return flow;  
    }  
      
    int main()  
    {  
     scanf("%d%d",&n,&m);  
     int i,j;  
     int a,b,w;  
     s=0;t=n+1;NN=n+2;  
     init();  
     for(i=1;i<=n;i++)  
     {  
      scanf("%d%d",&a,&b);  
      addege(s,i,a);  
      addege(i,t,b);  
     }  
     for(i=1;i<=m;i++)  
     {  
      scanf("%d%d%d",&a,&b,&w);  
      addege(a,b,w);  
      addege(b,a,w);  
     }  
     printf("%d/n",sap());  
     return 0;  
    }

Dinic问题的更多相关文章

  1. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  2. ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)

    最小割的好题,可用作模板. //Dinic+枚举字典序最小的最小割点集 //Time:1032Ms Memory:1492K #include<iostream> #include< ...

  3. 网络流dinic实现总结

    太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现 int dfs(int now,int flow,int sum) { if(now==n) return flo ...

  4. ACM/ICPC 之 Dinic算法(POJ2112)

    Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...

  5. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  6. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. ISAP算法对 Dinic算法的改进

    ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...

  8. hdu4292Food(最大流Dinic算法)

    /* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!f-food, p-people, d-drink 建图: 0(源点 ...

  9. DINIC网络流+当前弧优化

    DINIC网络流+当前弧优化 const inf=; type rec=record s,e,w,next:longint; end; var b,bb,d,q,tb:..] of longint; ...

  10. dinic模板

    procedure addedge(u,v,cap:longint); begin sid[tot].u:=u; sid[tot].v:=v; sid[tot].cap:=cap; sid[tot]. ...

随机推荐

  1. maven总结4

     仓库.nexus 构件:在maven中,任何一个依赖(jar包).插件(maven-compiler-plugin-2.5.1.jar)或者项目输出(前面例子中运行mvn clean install ...

  2. IO流的练习 —— 创建用户注册、登陆案例

    把上次用集合做的时候的分析拿出来 需求: 用户登录注册案例 按照如下操作,可以让我们更符合面向对象思想: A:这个案例有哪些类 B:每个类中又有哪些东西 C:类与类之间的关系 分析: A:这个案例有哪 ...

  3. Android优化——UI优化(五) Listview 重用convertView

    1.重用convertView 我们对convertView添加判断,如果存在我们就直接使用,否则初始化一个convertView的实例.(如下图) 2.使用viewHolder 使用viewHold ...

  4. for循环的三种写法

    第一种写法  传统的方法,遍历数组 String[] arr = { "amy", "heinrich", "cindy", "g ...

  5. 纯CSS3实现兔斯基简单害羞表情

    前言 很不巧前天突然就感冒了,都怪自己吃太多饼干导致上火了.整个人都无精打采.本来想多做几个兔斯基表情的,但身体发热很难受.所以就只完成一个简单点的表情耍一耍. 正文 先看一下这个简单到不能再简单的小 ...

  6. <global-results>怎么用

    <global-results>中的result可以被所有action跳转,所有action都可以跳转到result 所有返回值为“json”的action,都可以跳转到json.jsp

  7. 序列化在Netty中的使用

    Java序列化的缺点 1.无法跨语言 对于Java序列化后的字节数组,别的语言无法进行反序列化 2.序列化后的码流过大 3.序列化性能低 使用JDK自带的序列化进行对象的传输 被传输的,实现了序列化接 ...

  8. 使用c#创建php可以调用的dll

    1. 创建一个 C# Class Library ,命名为:ClassLibraryDemo 2. 打开项目的属性,在点选左边的 “Application”(就是第一个tab) , 然后点击 Asse ...

  9. poj3984迷宫问题 广搜+最短路径+模拟队列

    转自:http://blog.csdn.net/no_retreats/article/details/8146585   定义一个二维数组: int maze[5][5] = { 0, 1, 0, ...

  10. JS案例之7——瀑布流布局(2)

    这个例子与上一篇类似,唯一的区别是排序的方式有差别.上一篇是在高度最小的列里插入内容,这个案例是按顺序放置内容. 两种方法各有优缺点.第一种需要在图片内容加载完成的情况下有效.这个例子不需要在wind ...