Barricade---hdu5889(最短路+网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5889
题意:有n个点m条边,每条边的长度相同,我们可以默认为1,构成一个无向图;现在起点为1,终点为n,从起点到终点有很多路可走,现在已知每次走的都是最短路径;
现在要设置障碍,已知在每条边上设置障碍的代价wi, 为了让从起点到达终点一定能看到至少一个障碍,求建立障碍的最小代价;
思路:已知每次都会选择最短路径,所以我们可以把所有的最短路径所包含的边都找出来建立新的网络流图,然后求从起点到达终点的网络流即可;
参考题目hdu3416:http://www.cnblogs.com/zhengguiping--9876/p/5829830.html
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 100005
#define INF 0x3f3f3f3f
typedef long long LL; struct node
{
int v, w, d, Next;
node(int v_=, int w_=, int d_=) : v(v_), w(w_), d(d_){}
}e[N*]; vector<vector<node> >g;///存放原图;
int n, vis[N];
int dist[N];///spfa中的从起点到i的最短距离;
int l[N];///Dinic中的分层 int Head1[N], cnt1;
void Add1(int u, int v, int w)///添加新的边;
{
e[cnt1].v = v;
e[cnt1].w = w;
e[cnt1].Next = Head1[u];
Head1[u] = cnt1++;
} void Init()
{
g.clear();
g.resize(n+);
met(Head1, -);
cnt1 = ;
for(int i=; i<=n; i++)
{
vis[i] = ;
dist[i] = INF;
}
} void spfa()
{
dist[] = ;
vis[] = ;
queue<int>Q;
Q.push();
while(!Q.empty())
{
int p = Q.front();Q.pop();
vis[p] = ;
for(int i=, len=g[p].size(); i<len; i++)
{
int q = g[p][i].v;
if(dist[q] > dist[p]+g[p][i].d)
{
dist[q] = dist[p]+g[p][i].d;
if(!vis[q])
{
vis[q] = ;
Q.push(q);
}
}
}
}
} bool bfs(int s, int End)
{
met(l, );
queue<int>Q;
Q.push(s);
l[s] = ;
while(!Q.empty())
{
int u = Q.front();Q.pop();
if(u == End) return true;
for(int i=Head1[u]; i!=-; i=e[i].Next)
{
int v = e[i].v;
if(!l[v] && e[i].w)
{
l[v] = l[u]+;
Q.push(v);
}
}
}
return false;
} int dfs(int u, int MaxFlow, int End)
{
if(u == End)return MaxFlow; int uflow = ; for(int j=Head1[u]; j!=-; j=e[j].Next)
{
int v = e[j].v;
if(l[v]==l[u]+ && e[j].w)
{
int flow = min(e[j].w, MaxFlow-uflow);
flow = dfs(v, flow, End);
e[j].w -= flow;
e[j^].w += flow;
uflow += flow;
if(uflow == MaxFlow)
break;
}
}
if(uflow == )
l[u] = ;
return uflow;
} int Dinic()
{
int MaxFlow = ;
while(bfs(, n))
MaxFlow += dfs(, INF, n);
return MaxFlow;
} int main()
{
int T, m, u, w, v;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m); Init(); for(int i=; i<=m; i++)
{
scanf("%d %d %d", &u, &v, &w);
g[u].push_back(node(v, w, ));
g[v].push_back(node(u, w, ));
} spfa();///更新dist for(int i=; i<=n; i++)
{
for(int j=, len=g[i].size(); j<len; j++)
{
int p = g[i][j].v;
if(dist[p] == dist[i] + g[i][j].d)///说明从点i到达点p的路在最短路径上;
{
Add1(i, p, g[i][j].w);///建立新图;
Add1(p, i, );///注意这里是0;
}
}
} int ans = Dinic();///求最大流即可; printf("%d\n", ans);
}
return ;
}
Barricade---hdu5889(最短路+网络流)的更多相关文章
- HDU 5889 (最短路+网络流)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU5889 Barricade(最短路)(网络流)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5889 Barricade(最短路+最小割水题)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- SGU 185 Two shortest ★(最短路+网络流)
[题意]给出一个图,求 1 -> n的2条 没有重边的最短路. 真◆神题--卡内存卡得我一脸血= =-- [思路] 一开始我的想法是两遍Dijkstra做一次删一次边不就行了么你们还又Dijks ...
- hdu3416 Marriage Match IV(最短路+网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3416 题意: 给出含n个点.m条有向边的图,每条边只能走一次,给出起点和终点,求起点到终点的最短路径有 ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- hdu-3416(最短路+网络流)
题意:给你一个有向权图,问你从S到E有几条最短路,每条边直走一次的情况下: 解题思路:每条边直走一次,最大流边权为1,因为要算几条最短路,那么能得到最短路的路径标记下,然后跑最大流 代码: #incl ...
- hdu-5889-最短路+网络流/最小割
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5889 Barricade(最短路+最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...
随机推荐
- 小结:ac自动机
复杂度: 查找O(n),维护O(n) 概要: 应用了kmp的自匹配思想,在trie建图时维护一个fali指针,指向上一个匹配的点,这点是用bfs做到.匹配串的时候同样没匹配到就和kmp一样返回. 应用 ...
- MatLab GUI Change Size 改变界面大小
在MatLab做的GUI界面,我们有时候会希望界面的大小能改变,并且上面的控件也会跟着界面变大或者缩小,MatLab在这方面做的非常好,不像Qt的GUI那样实现起来那么麻烦,只需要把界面的属性Resi ...
- javascript 数据类型 变量 类型转换运算符
数据类型: 1.字符串(被双引号所包含的内容),小数,整数,日期时间,布尔型等. 2.变量: 都是通用类型的var, 定义一个变量格式:var a: 3.类型转换: 分为自动转换和强制转换,一般 ...
- JS。 问题类型:穷举,迭代。两个关键词:break和continue
问题类型: 穷举:(在不知道什么情况下是我们需要的结果的时候只能够让它一个一个都给走一遍) 百鸡百钱:公鸡1钱,母鸡2钱,小鸡0.5钱. 思路: 公鸡买100只,母鸡,小鸡都是0只: 母鸡50只,公鸡 ...
- hdu-acm steps FatMouse's Speed
本想用暴力法先试试的,案例和自己找的数据都过掉了,但是始终wa,本来期待的是tle,结果始终wa.所以也就懒的管了,直接用dp来做了.主要是因为最近在刷暴力法和dp这两个专题,所以才想好好利用一下这道 ...
- yii uploadfile 错误提示: fileinfo php extension is not installed
rule规则里面增加 'checkExtensionByMimeType'=>false,
- Static Random-Access Memory Dynamic Random-Access Memory
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION RAM technology is div ...
- maven 的一些基本操作
maven install :把打出的包装载到本地仓库,package:是打包的意思 每当项目中的模块里的东西发生变化的时候,先install一下项目 ,在启用maven的tomcat插件就不会报错 ...
- 在fortran下进行openmp并行计算编程
最近写水动力的程序,体系太大,必须用并行才能算的动,无奈只好找了并行编程的资料学习了.我想我没有必要在博客里开一个什么并行编程的教程之类,因为网上到处都是,我就随手记点重要的笔记吧.这里主要是open ...
- Apache与Tomcat 区别联系(转)
转自:http://www.admin10000.com/document/974.html Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP ...