HDU 5889 Barricade(最短路+最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=5889
题意:
给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点。现在帝国将军要在路径上放置障碍,每条边上都有一个放置障碍的代价。求至少需要多少代价。
思路:
首先就是求最短路,然后将最短路上的边重新进行构图跑最小割即可。
一开始求了两遍bfs,分别求出起点到各个点的距离和终点到各个点的距离,然后去判断每条边是否在最短路中,但是这样的话在最大流的构图中无法确定方向,然后就一直Wa。。。
其实跑一遍就够了。。
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<set>
- #include<bitset>
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> pll;
- const int INF = 0x3f3f3f3f;
- const int maxn=+;
- int n,m;
- vector<pll> G[maxn];
- bool vis[maxn];
- int d[maxn];
- void bfs(int s)
- {
- memset(vis,false,sizeof(vis));
- queue<int> Q;
- Q.push(s);
- d[s]=;
- vis[s]=true;
- while(!Q.empty())
- {
- int u=Q.front(); Q.pop();
- for(int i=;i<G[u].size();i++)
- {
- int v=G[u][i].first;
- if(!vis[v])
- {
- vis[v]=true;
- d[v]=d[u]+;
- Q.push(v);
- }
- }
- }
- }
- struct Edge
- {
- int from,to,cap,flow;
- Edge(int u,int v,int w,int f):from(u),to(v),cap(w),flow(f){}
- };
- struct Dinic
- {
- int n,m,s,t;
- vector<Edge> edges;
- vector<int> G[maxn];
- bool vis[maxn];
- int cur[maxn];
- int d[maxn];
- void init(int n)
- {
- this->n=n;
- for(int i=;i<n;++i) G[i].clear();
- edges.clear();
- }
- void AddEdge(int from,int to,int cap)
- {
- edges.push_back( Edge(from,to,cap,) );
- edges.push_back( Edge(to,from,,) );
- m=edges.size();
- G[from].push_back(m-);
- G[to].push_back(m-);
- }
- bool BFS()
- {
- queue<int> Q;
- memset(vis,,sizeof(vis));
- vis[s]=true;
- d[s]=;
- Q.push(s);
- while(!Q.empty())
- {
- int x=Q.front(); Q.pop();
- for(int i=;i<G[x].size();++i)
- {
- Edge& e=edges[G[x][i]];
- if(!vis[e.to] && e.cap>e.flow)
- {
- vis[e.to]=true;
- d[e.to]=d[x]+;
- Q.push(e.to);
- }
- }
- }
- return vis[t];
- }
- int DFS(int x,int a)
- {
- if(x==t || a==) return a;
- int flow=, f;
- for(int &i=cur[x];i<G[x].size();++i)
- {
- Edge &e=edges[G[x][i]];
- if(d[e.to]==d[x]+ && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>)
- {
- e.flow +=f;
- edges[G[x][i]^].flow -=f;
- flow +=f;
- a -=f;
- if(a==) break;
- }
- }
- return flow;
- }
- int Maxflow(int s,int t)
- {
- this->s=s; this->t=t;
- int flow=;
- while(BFS())
- {
- memset(cur,,sizeof(cur));
- flow +=DFS(s,INF);
- }
- return flow;
- }
- }DC;
- int main()
- {
- //freopen("in.txt","r",stdin);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++) G[i].clear();
- for(int i=;i<m;i++)
- {
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- G[u].push_back(make_pair(v,w));
- G[v].push_back(make_pair(u,w));
- }
- bfs();
- DC.init(n+);
- for(int i = ;i<=n;i++)
- for(int j = ;j<G[i].size();j++)
- if(d[G[i][j].first]==d[i]+)
- DC.AddEdge(i,G[i][j].first,G[i][j].second);
- printf("%d\n",DC.Maxflow(,n));
- }
- return ;
- }
HDU 5889 Barricade(最短路+最小割)的更多相关文章
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Barricade HDU - 5889(最短路+最小割)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 6852Path6(最短路+最小割)
传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...
- HDU - 6582 Path (最短路+最小割)
题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...
- 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- HDU 5889 Barricade(最短路+最小割水题)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
- HDU 4289:Control(最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...
- HDU 3452 Bonsai(网络流之最小割)
题目地址:HDU 3452 最小割水题. 源点为根节点.再另设一汇点,汇点与叶子连边. 对叶子结点的推断是看度数是否为1. 代码例如以下: #include <iostream> #inc ...
随机推荐
- dedecms文章页调用地址(当前文章URL)如何操作?
我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个cannacial标签,告诉搜索引擎url的 ...
- Ubuntu Kylin 14.04 安装配置 jdk、eclipse、tomcat 通用
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1053781225/article/details/24810107 一.安装jdk ...
- HTML5-CSS3-JavaScript(3)
我们就从HTML5的基础总结起.希望可以提高自身的基础. HTML5 头部 和 元信息 使用 <head.../> 元素可以定义HTML文档头,该元素可以包含如下子元素. <scri ...
- 十天精通CSS3(1)
什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...
- [py][mx]django课程页显示city和机构封面图
city和课程机构信息展示到前台去 organization/views.py from django.views.generic.base import View from organization ...
- Flask中'endpoint'(端点)的理解
翻译整理自Stack Overflow:http://stackoverflow.com/questions/19261833/what-is-an-endpoint-in-flask 原文中用到了m ...
- Must be between v0 and v15, inclusive解决办法
invoke-static 改为invoke-static/range
- Intro to Python for Data Science Learning 2 - List
List from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-2-python-list ...
- 测试开发-PC客户端测试要点
一级测试点 二级测试点 安装测试 首次安装(exe和msi格式的不同) 安装程序权限检查 软件安装包的描述和属性信息 静默安装和非静默安装测试 有UAC安装.无UAC安装 联网安装.断网安装 对必 ...
- [转载]DropDownList三级菜单联动源码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...