zoukankan      html  css  js  c++  java
  • UVA 820 Internet Bandwidth 因特网宽带(无向图,最大流,常规)

    题意:给一个无向图,每条边上都有容量的限制,要求求出给定起点和终点的最大流。

    思路:每条无向边就得拆成2条,每条还得有反向边,所以共4条。源点汇点已经给出,所以不用建了。直接在图上跑最大流就可以了。

     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 #define pii pair<int,int>
     4 #define INF 0x7f7f7f7f
     5 using namespace std;
     6 const int N=200;
     7 const int mod=1e9+7;
     8 int s, t;
     9 
    10 int path[N], flow[N];
    11 vector<int> vect[N];
    12 
    13 struct node
    14 {
    15     int from, to, cap, flow;
    16     node(){};
    17     node(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow){};
    18 }edge[100000];
    19 int edge_cnt;
    20 
    21 void add_node(int from,int to,int cap,int flow)
    22 {
    23     edge[edge_cnt]=node(from,to,cap,flow);
    24     vect[from].push_back(edge_cnt++);
    25 }
    26 
    27 int BFS(int s,int e)
    28 {
    29     deque<int> que(1,s);
    30     flow[s]=INF;
    31     while(!que.empty())
    32     {
    33         int x=que.front();
    34         que.pop_front();
    35         for(int i=0; i<vect[x].size(); i++)
    36         {
    37             node e=edge[vect[x][i]];
    38             if(!flow[e.to] && e.cap>e.flow)
    39             {
    40                 flow[e.to]=min(flow[e.from],e.cap-e.flow);
    41                 path[e.to]=vect[x][i];
    42                 que.push_back(e.to);
    43             }
    44         }
    45         if(flow[e]) return flow[e];
    46     }
    47     return flow[e];
    48 }
    49 
    50 int max_flow(int s,int e)
    51 {
    52     int ans_flow=0;
    53     while(true)
    54     {
    55         memset(path,0,sizeof(path));
    56         memset(flow,0,sizeof(flow));
    57 
    58         int tmp=BFS(s,e);
    59         if(!tmp)    return ans_flow;
    60         ans_flow+=tmp;
    61 
    62         int ed=e;
    63         while(ed!=s)
    64         {
    65             int t=path[ed];
    66             edge[t].flow+=tmp;
    67             edge[t^1].flow-=tmp;
    68             ed=edge[t].from;
    69         }
    70     }
    71 }
    72 int main()
    73 {
    74     freopen("input.txt", "r", stdin);
    75     int n, a, b, v, c, j=0;
    76     while(scanf("%d",&n),n)
    77     {
    78         edge_cnt=0;
    79         memset(edge,0,sizeof(edge));
    80         for(int i=0; i<=n+1; i++)   vect[i].clear();
    81 
    82         scanf("%d%d%d", &s, &t, &c);
    83         for(int i=0; i<c; i++)
    84         {
    85             scanf("%d%d%d",&a,&b,&v);
    86             add_node(a, b, v, 0);
    87             add_node(b, a, 0, 0);
    88             add_node(b, a, v, 0);
    89             add_node(a, b, 0, 0);
    90         }
    91         printf("Network %d
    ",++j);
    92         printf("The bandwidth is %d.
    
    ", max_flow(s ,t) );
    93     }
    94     return 0;
    95 }
    AC代码
  • 相关阅读:
    刚刚找到的IP地址对应地区数据库
    SQL2000中像SQL2005中的Row_Number一样获取行号
    KindEditor3.4.4版的ASP.NET版本
    使用程序代码输出论坛回复第X层楼
    IIS上启用Gzip压缩(HTTP压缩)详解(PDF)
    ASP.NET中过滤HTML字符串的两个方法
    七个受用一生的心理寓言
    Android获取其他包的Context实例然后XX(转载)
    android junit基础教程
    java获取web容器地址
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4661167.html
Copyright © 2011-2022 走看看