• zoj 3130 最小费用最大流 (求 s到e 的两条总花费最少的 完全没有交点的 路径)


     http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3130

    【题意】: 给一个有向图 每条边有费用  求 s到e 的两条总花费最少的 完全没有交点的 路径

    【思路】:把每条路径 的容量赋值为1  于是每条边就只能添加一次了  再每次增广 增广了两次即找到了两条路径就 输出答案了

      1  #include<iostream>
      2  #include<vector>
      3  #include<string.h>
      4  #include<queue>
      5  #include<stdio.h>
      6  using namespace std;
      7 
      8  #define INF 100000000
      9  struct E{int from;int to;int c;int f;int cost;};
     10  vector <int> g[202];
     11  vector<E> edge;
     12  int d[202],vis[202],p[202];//cur[102],num[102],p[102],w[1102],n;
     13  int n,m;
     14  queue<int > q;
     15 
     16 
     17  void add(int from,int to,int c,int cost)
     18  {
     19      E temp1,temp2;
     20      temp1.from =from; temp1.to=to; temp1.c=c;temp1.f=0; temp1.cost=cost;
     21      temp2.from =to; temp2.to=from; temp2.c=0;temp2.f=0; temp2.cost=-cost;
     22      edge.push_back (temp1);
     23      edge.push_back (temp2);
     24      int m=edge.size ();
     25      g[from].push_back (m-2);
     26      g[to].push_back (m-1);
     27  }
     28 
     29  int solve(int s,int e)
     30  {
     31      int maxflow=0;
     32      int mincost=0;
     33      while(1)
     34      {
     35          memset(vis,0,sizeof(vis));
     36          for(int i=0;i<=n;i++)
     37             d[i]=INF;
     38          d[s]=0;    p[s]=-1;//!!!!
     39          q.push(s); vis[s]=1;
     40          while(!q.empty())
     41          {
     42              int temp;
     43              temp=q.front(); q.pop(); vis[temp]=0;
     44              for(int i=0;i<g[temp].size();i++)
     45              {
     46                  int v;
     47                  v=g[temp][i];//di v tiao bian  bian t
     48                  E t=edge[v];
     49                  if(t.c>t.f&&d[t.from]+t.cost<d[t.to])
     50                  {
     51                      d[t.to]=d[t.from]+t.cost;
     52                      p[t.to]=v;
     53                      if(vis[t.to]==0)
     54                      {
     55                          q.push(t.to);
     56                          vis[t.to]=1;
     57 
     58                      }
     59                  }
     60 
     61              }
     62          }
     63          if(d[e]==INF)
     64             break;
     65         int a=INF;
     66         for(int u=e;u!=s;u=edge[p[u]].from)
     67         {
     68             mincost+=edge[p[u]].cost;
     69             edge[p[u]].f+=1;
     70             edge[p[u]^1].f-=1;
     71         }
     72         maxflow++;
     73         if(maxflow==2)
     74             return mincost;
     75      }
     76      return -1;
     77  }
     78 
     79 void init(int n)
     80 {
     81     for(int i=0;i<=n;i++)
     82         g[i].clear();
     83     edge.clear();
     84 }
     85 
     86 
     87 int main()
     88  {
     89      int p=1,a,b,c;
     90      while(1)
     91      {
     92          scanf("%d%d",&n,&m);
     93          if(n==0&&m==0)
     94             break;
     95         init(n);
     96          while(m--)
     97          {
     98              scanf("%d%d%d",&a,&b,&c);
     99              add(a,b,1,c);
    100          }
    101          int pp;
    102          pp=solve(0,n-1);
    103          printf("Instance #%d: ",p++);
    104          if(pp==-1)
    105              printf("Not possible
    ");
    106          else
    107             printf("%d
    ",pp);
    108      }
    109      return 0;
    110  }
  • 相关阅读:
    企业生产环境不同业务linux系统分区方案
    linux 文件 s 权限
    shell中的命令与特殊符号
    Linux数组基础
    shell脚本学习(1)
    文件的压缩与打包
    Linux 磁盘管理基础命令df,du,fdisk,mke2fs
    mkpasswd的使用
    P1080 国王游戏
    P1315 观光公交
  • 原文地址:https://www.cnblogs.com/assult/p/3722405.html
Copyright © 2020-2023  润新知