http://acm.hdu.edu.cn/showproblem.php?pid=3947

题意:一个有向树(河流),只有一个汇点1,每条边只有一个出度。有些河道有污染指数xi,必需要治理,有m段路径,可以去覆盖这些,每被覆盖一次,xi降低响应值。

即 给出一些边必需要覆盖的次数,用m段路径去覆盖,每次覆盖有相应费用,求最小费用。

题解:网络流+最小费用流+流量不等式建图

先设立超级源汇S=0、T=1。

首先对给定的树边建立反向边,然后从结点1开始遍历整棵树,如果到达叶子结点x,则建边(S,x,M,0)(其中M为大整数)。

如果v不是叶子结点,且v的父节点为u,(u,v)的边权为w,则看x的子树内叶子结点的个数num,建边(v,u,num*M-w,0)。

最后对所有的道具建边(u,v,c,w)。

最后跑一遍最小费用最大流,如果流量等于以1为根结点的数的叶子节点个数*M,则输出cost,否则输出-1。

可认为道具是弥补流量不足的情况的。

流量不等式建图

道具加边

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=1000+10;
const int M=10000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int s,t,n,m,k,p,l,r,u,v,w,c;
ll ans,flag,temp,sum,minz,maxflow;
ll dis[N];
bool vis[N];
struct Node{int u,v;ll w;Node(){};Node(int form,int to,ll w):u(form),v(to),w(w){}
};
struct node{int u,v;ll c,w;node(){};node(int form,int to,ll cap,ll w):u(form),v(to),c(cap),w(w){}
};
vector<node>edge;
vector<int> G[N];
vector<Node>Edge[N];
void Addedge(int u,int v,ll cap,ll w){edge.push_back({u,v,cap,w});edge.push_back({v,u,0,-w});//cout<<u<<" "<<v<<" "<<cap<<endl;int sz=edge.size();G[u].push_back(sz-2);G[v].push_back(sz-1);
}
bool bfs(int u){//memset(dis,-1,sizeof(dis));for(int i=0;i<=n;i++)dis[i]=INF,vis[i]=0;dis[u]=0;queue<int>q;q.push(u);vis[u]=1;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){node e=edge[G[u][i]];//cout<<u<<" bfs "<<e.v<<endl;if(dis[e.v]>dis[u]+e.w&&e.c>0){dis[e.v]=dis[u]+e.w;if(!vis[e.v]){vis[e.v]=1;q.push(e.v);}}}}return dis[t]!=INF;
}
int dfs(int u,ll flow){vis[u]=1;if(u==t)return flow;int now;for(int i=0;i<G[u].size();i++){node e=edge[G[u][i]];//cout<<u<<" dfs "<<e.v<<endl;if((!vis[e.v]||e.v==t)&&e.c>0&&dis[u]+e.w==dis[e.v]&&(now=dfs(e.v,min(flow,e.c)))){ans+=e.w*now;//cout<<now<<endl;edge[G[u][i]].c-=now;edge[G[u][i]^1].c+=now;return now;}}return 0;
}
void dinic(){while(bfs(s)){//cout<<ans<<endl;int res=0;while((res=dfs(s,INF))){maxflow+=res;memset(vis,0,sizeof(vis));}}
}
int DFS_TREE(int u){if(Edge[u].size()==0){Addedge(s,u,M,0);return 1;}int res=0;for(int i=0;i<Edge[u].size();i++){int v=Edge[u][i].v;//cout<<u<<" tree "<<v<<endl;int leaf=DFS_TREE(v);res+=leaf;Addedge(v,u,leaf*M-Edge[u][i].w,0);}return res;
}
void init(){s=0;t=1;for(int i=0;i<=n;i++)G[i].clear(),Edge[i].clear();edge.clear();ans=0;sum=0;maxflow=0;
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&k);int T=0;while(k--){scanf("%d",&n);init();for(int i=1;i<n;i++){scanf("%d%d%d",&u,&v,&c);Edge[v].push_back({v,u,c});}sum=DFS_TREE(1)*M;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d%d%d",&u,&v,&c,&w);Addedge(u,v,c,w);}dinic();//cout<<maxflow<<endl;cout<<"Case #"<<++T<<": "<<(maxflow==sum?ans:-1)<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

HDU 3947 River Problem相关推荐

  1. hdu A + B Problem II(大数相加,数组实现)

    hdu A + B Problem II(大数相加,数组实现) 题目走起 注意最后一个case 不需要换行 下面代码 #include<stdio.h> #include<strin ...

  2. HDU.1001 Sum Problem

    原题 HDU.1001 Sum Problem 分类 杂题 题意 计算从1到正整数n的累加和. 输入/输出 要求与格式 输入内容 每行输入一个正整数 输出结果 结果为累加和 输出格式 每个输出结果独占 ...

  3. [HDU 5445]Food Problem[多重背包]

    题目链接:[HDU 5445]Food Problem[多重背包] 题意分析: 有n种类型的点心,每种提供t的能量,占据u的空间,有v个: 有m种类型的卡车,每种容量x,雇佣花费y,能提供z辆: 点心 ...

  4. hdu 3549 Flow Problem(最大流模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known ...

  5. hdu 1023 Train Problem II

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1212 Train Problem II Description As we all know the ...

  6. HDU 5427 A problem of sorting 水题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5427 A problem of sorting Time Limit: 2000/1000 MS ( ...

  7. HDU 1022[Train Problem I] 栈的应用

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意:一列序列为s1的车厢是否能通过车站的中转以序列s2出站.白皮上有. 关键思想:栈的应用 ...

  8. HDU 3549 Flow Problem (dinic模版 isap模版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 题意: 给你一个有向图,问你1到n的最大流. dinic模版 (n*n*m) 1 #includ ...

  9. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)

    Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当的好,这 ...

最新文章

  1. html text alt,HTML alt text for image maps
  2. 【Elastic Stack学习】ELK日志分析平台(一)ELK简介、ElasticSearch集群
  3. 从Java 9 到 Java 17之Java 12
  4. 统一账号/统一认证系统的引入和搭建(LDAP)
  5. 全能终端神器 --- MobaXterm 、开启 linux 远程桌面
  6. 虚拟机Linux----Ubuntu1204----root登录设置
  7. git 拉新项目_Git学习系列之Git基本操作拉取项目(图文详解)
  8. 20. Valid Parentheses[E]有效的括号
  9. hdu3081 Marriage Match II
  10. 十三、结构类型(5)——联合
  11. android多个单选框超格,福昕PDF阅读器打印时提示“打印机被意外删除了”怎么处理?...
  12. oracle12能卸干净吗,Oracle卸载干净方法
  13. 微弱信号检测(放大电路篇——集成运放)
  14. 朋友圈点赞截图在线生成源码
  15. RocketMQ Topic是如何注册和保存的
  16. PloneBook中文版
  17. 文件名变乱码. 不知道怎么找回呢
  18. base64转MultipartFile并压缩得到压缩后对的MultipartFile
  19. 正则表达式(一)认识正则表达式
  20. Vue的Watch事件-如何监听对象的属性(字段中间带有点)

热门文章

  1. java网络编程udp_Java网络编程之UDP
  2. eui加载时间长_面试官:为什么 HashMap 的加载因子是0.75?
  3. java arraylist初始大小_Java - ArrayList默认初始值
  4. stanford course
  5. 内网穿透和内网映射区别是什么?
  6. r2游戏服务器网站,云服务器win2008r2玩游戏
  7. aes子密钥生成c语言_HBase配置AES加密
  8. Luban(鲁班)——可能是最接近微信朋友圈的图片压缩算法
  9. 二十六、爬取拉钩网Python职位的数据
  10. 十二、深入Python列表和元组