Barricade

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Problem Description
The empire is under attack again. The general of empire is planning to defend his castle. The land can be seen as N towns and M roads, and each road has the same length and connects two towns. The town numbered 1 is where general's castle is located, and the town numbered N is where the enemies are staying. The general supposes that the enemies would choose a shortest path. He knows his army is not ready to fight and he needs more time. Consequently he decides to put some barricades on some roads to slow down his enemies. Now, he asks you to find a way to set these barricades to make sure the enemies would meet at least one of them. Moreover, the barricade on the i-th road requires wi units of wood. Because of lacking resources, you need to use as less wood as possible.
 
Input
The first line of input contains an integer t, then t test cases follow.
For each test case, in the first line there are two integers N(N≤1000) and M(M≤10000).
The i-the line of the next M lines describes the i-th edge with three integers u,v and w where 0≤w≤1000 denoting an edge between u and v of barricade cost w.
 
Output
For each test cases, output the minimum wood cost.
 
Sample Input
1
4 4
1 2 1
2 4 2
3 1 3
4 3 4
 
Sample Output
4
分析:对最短路求最小割最大流即可;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
const int maxn=1e3+;
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
int n,m,k,t,h[maxn],tot,vis[maxn],s,cur[maxn],f[maxn],d[maxn],g[maxn];
vi edge[maxn];
struct Node
{
int x,y,z;
Node(){}
Node(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
}op[];
struct node
{
int to,nxt,cap,flow;
}e[<<];
void add(int x,int y,int z)
{
e[tot].to=y;
e[tot].nxt=h[x];
e[tot].cap=z;
e[tot].flow=;
h[x]=tot++;
e[tot].to=x;
e[tot].nxt=h[y];
e[tot].flow=;
h[y]=tot++;
}
bool bfs()
{
memset(vis,,sizeof vis);
queue<int>p;
p.push(s);
vis[s]=;
while(!p.empty())
{
int x=p.front();p.pop();
for(int i=h[x];i!=-;i=e[i].nxt)
{
int to=e[i].to,cap=e[i].cap,flow=e[i].flow;
if(!vis[to]&&cap>flow)
{
vis[to]=vis[x]+;
p.push(to);
}
}
}
return vis[t];
}
void pr_bfs(int s)
{
int i;
memset(d,inf,sizeof d);
memset(vis,,sizeof vis);
queue<int>p;p.push(s);vis[s]=;d[s]=;
while(!p.empty())
{
int q=p.front();p.pop();vis[q]=;
for(int x:edge[q])
{
if(d[x]>d[q]+)
{
d[x]=d[q]+;
if(!vis[x])p.push(x),vis[x]=;
}
}
}
if(s==n)rep(i,,n)f[i]=d[i];
else rep(i,,n)g[i]=d[i];
return;
}
int dfs(int x,int a)
{
if(x==t||a==)return a;
int ans=,j;
for(int&i=cur[x];i!=-;i=e[i].nxt)
{
int to=e[i].to,cap=e[i].cap,flow=e[i].flow;
if(vis[to]==vis[x]+&&(j=dfs(to,min(a,cap-flow)))>)
{
e[i].flow+=j;
e[i^].flow-=j;
ans+=j;
a-=j;
if(a==)break;
}
}
return ans;
}
int max_flow(int s,int t)
{
int flow=,i;
while(bfs())
{
memcpy(cur,h,sizeof cur);
flow+=dfs(s,inf);
}
return flow;
}
int main()
{
int i,j,test;
scanf("%d",&test);
while(test--)
{
tot=;
memset(h,-,sizeof h);
scanf("%d%d",&n,&m);
rep(i,,n)edge[i].clear();
rep(i,,m-)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
op[i]=Node(a,b,c);
edge[a].pb(b),edge[b].pb(a);
}
pr_bfs(n);
pr_bfs();
rep(i,,m-)
{
int a=op[i].x,b=op[i].y,c=op[i].z;
if(f[a]+g[b]+==f[])add(a,b,c);
if(f[b]+g[a]+==f[])add(b,a,c);
}
s=n,t=;
printf("%d\n",max_flow(s,t));
}
//system("Pause");
return ;
}
 

2016青岛网络赛 Barricade的更多相关文章

  1. HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

    题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fa ...

  2. HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)

    题目链接  2016 Qingdao Online Problem I 题意  在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...

  3. HDU - 5878 2016青岛网络赛 I Count Two Three(打表+二分)

    I Count Two Three 31.1% 1000ms 32768K   I will show you the most popular board game in the Shanghai ...

  4. HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)

    Herbs Gathering 10.76% 1000ms 32768K   Collecting one's own plants for use as herbal medicines is pe ...

  5. HDU5887 Herbs Gathering(2016青岛网络赛 搜索 剪枝)

    背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d]. ...

  6. HDU5880 Family View(2016青岛网络赛 AC自动机)

    题意:将匹配的串用'*'代替 tips: 1 注意内存的使用,据说g++中指针占8字节,c++4字节,所以用g++交会MLE 2 注意这种例子, 12abcdbcabc 故失败指针要一直往下走,否则会 ...

  7. 2016青岛网络赛 Sort

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  8. 2016青岛网络赛 The Best Path

    The Best Path Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Pr ...

  9. 2016 年青岛网络赛---Family View(AC自动机)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5880 Problem Description Steam is a digital distribut ...

随机推荐

  1. HDU2202--最大三角形(凸包,枚举)

    Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy ...

  2. TCP/IP体系结构

    如果你确实还没接触过网络.数据通信方面的技术,那么咱们的路还很长,至少我认为软件测试并非只停留在上层的应用,而测试的最高境界应该是对底层核心技术的测试,通过架构分析.协议数据包分析等等来测试出结果-- ...

  3. linux脚本Shell之awk详解(二)

    三.printf的使用   print format 生成报表 %d        十进制有符号整数 %u        十进制无符号整数 %f        浮点数 %s        字符串 %c ...

  4. JavaScript高级程序设计:第八章

    1.window对象——BOM的核心 BOM的核心对象时window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过javascript访问浏览器窗口的一个接口,又是ECM ...

  5. Linux入门(一)常见虚拟机及Linux系统安装、xshell连接虚拟机

    1环境 linux常用两种虚拟机 1.1  oracle VM VirtualBox 官方网站:https://www.virtualbox.org/ 1.2  vmware  下载链接:https: ...

  6. hdu_5791_Two(DP)

    题目链接:hdu_5791_Two 题意: 给你两串数列,问你相同的子序列有多少个,要注意,可以重复,比如1 和1 1 1 ,相同的子序列为3个 题解: 就和求最长公共子序列差不多,只不过要全部加起来 ...

  7. Linux系统故障处理案例(一)【转】

    2016-08-05 14:41 运行环境:CentOS6.7 故障原因: 昨天在线执行命令yum -y update 在命令执行途中,强制中断并直接运行poweroff命令关机.再次开机出现如图所示 ...

  8. ckediter

    ckediter ##<link rel='stylesheet' href='/css/index.css' /> <script type="text/javascri ...

  9. 使用shell脚本自定义实现选择登录ssh

    在系统bin目录中建立两个脚本分别是pssh tssh pssh #!/usr/bin/expect -f set ip [lindex ] set port [lindex ] set passwo ...

  10. PHP之音乐ID3扩展

    不知道你有没有这样的经历,一些从网上下载的MP3音乐,文件名明明是01.02这样的序号,但播放时却能显示出歌曲的正确名称来,是不是有点奇妙? 这其实都是ID3在暗中相助 ID3,一般是位于一个mp3文 ...