zoukankan      html  css  js  c++  java
  • 做题笔记 因特网带宽 Internet Bandwidth UVA820

    首先,从题面入手,这题很明显的是一个网络流裸题
    当你高高兴兴地打了一遍从P3376来的代码后,等待你的是一个

    WA!

    为什么?
    现在看原文,我们可以发现一个很容易搞错的点:每条边都是无向边!(作者WA了5次都是跪在这个上面),所以,我们只要在加边的时候注意残量网络的流量上限不是0,这题就非常容易了。
    我使用了蓝书风格的Dinic,

    AC代码如下:

      1 #include <cstdio>
      2 #include <cctype>
      3 #include <vector>
      4 #include <iostream>
      5 #include <cstring>
      6 #include <queue>
      7 #define MAXN 100+5
      8 #define INF 200512233
      9 using namespace std;
     10 
     11 struct edge {
     12     int from,to,flow,cap;
     13     edge(int u,int v,int f,int c): from(u),to(v),flow(f),cap(c){};
     14 };
     15 
     16 inline int read() {
     17     int a = 0,f = 1;
     18     char v = getchar();
     19     while(!isdigit(v)) {
     20         if (v == '-') {
     21             f = -1;
     22         } 
     23         v = getchar();
     24     }
     25     while (isdigit(v)) {
     26         a = a * 10 + v - 48;
     27         v = getchar();
     28     }
     29     return a * f;
     30 }
     31 
     32 vector <int> G[MAXN];
     33 vector <edge> edges;
     34 int d[MAXN],n,m,s,t,T;
     35 int cur[MAXN];
     36 bool vis[MAXN];
     37 
     38 void init (int n) {
     39     for (int i = 1;i <= n;i++) {
     40         G[i].clear();
     41     }
     42     edges.clear();
     43 } 
     44 
     45 void addedge(int from,int to,int cap) {
     46     edges.push_back(edge(from,to,0,cap));
     47     edges.push_back(edge(to,from,0,cap));//最重要的一行代码!!!!!
     48     int m = edges.size();
     49     G[from].push_back(m-2);
     50     G[to].push_back(m-1);
     51 }
     52 
     53 bool bfs() {
     54     memset(vis,0,sizeof(vis));
     55     queue <int> q;
     56     q.push(s);
     57     d[s] = 0;
     58     vis[s] = 1;
     59     while (!q.empty()) {
     60         int x = q.front();
     61         //printf("bfs: x:%d\n",x);
     62         q.pop();
     63         for (int i = 0;i < G[x].size();i++) {
     64             edge& e = edges[G[x][i]];
     65             if (!vis[e.to] && e.cap > e.flow) {//考虑残量网络中的 
     66                 vis[e.to] = 1;
     67                 d[e.to] = d[x] + 1;
     68                 q.push(e.to);
     69             }
     70         }
     71     }
     72     return vis[t];//返回是否有增广路 
     73 }
     74 
     75 int dfs(int x,int a) {
     76     //printf("dfs: x:%d a:%d\n",x,a);
     77     if (x == t || a == 0) {
     78         return a;
     79     }
     80     int flow = 0,f;
     81     for (int& i = cur[x];i < G[x].size();i++) {
     82         edge& e = edges[G[x][i]];
     83         if (d[x] + 1 == d[e.to] && (f = dfs(e.to,min(a,e.cap - e.flow)))) {
     84             e.flow += f;
     85             edges[G[x][i]^1].flow -= f;
     86             flow += f;
     87             a -= f;
     88             if (a == 0) {
     89                 break;
     90             }
     91         }
     92     }
     93     return flow;
     94 }
     95 
     96 int maxflow() {
     97     int flow = 0;
     98     while (bfs()) {
     99         memset(cur,0,sizeof(cur));
    100         flow += dfs(s,INF);
    101     }
    102     return flow;
    103 }
    104 
    105 int main() {
    106     while(n = read()) {
    107         init(n);
    108         s = read(),t = read(),m = read();
    109         for (int i = 1;i <= m;i++) {
    110             int u = read(),v = read(),f = read();
    111             addedge(u,v,f);
    112         } 
    113         int ans = maxflow();
    114         printf("Network %d\n",++T);
    115         printf("The bandwidth is %d.\n\n",ans);
    116     }
    117     return 0;
    118 }
  • 相关阅读:
    axis2 WebService 请求参数xml格式
    钉钉扫码登录第三方,appSecret签名算法(附包名)
    win10 IE浏览器中,设置指定程序查看源文件,设置查看源默认程序
    myeclipse CI 2018.8.0和 myeclipse 10 禁止空格自动上屏,自动补全插件
    开发必备网站记录
    二叉树的前序中序后序遍历(简洁)
    贪心算法入门
    Java-二分查找与二叉树关系详解-2021-7-20
    Visual Studio Code快速创建模板(html等)
    java 面向对象1之继承
  • 原文地址:https://www.cnblogs.com/doubeecat/p/10328467.html
Copyright © 2011-2022 走看看