There is a war

Problem Description
      There is a sea.

      There are N islands in the sea.

      There are some directional bridges connecting these islands.

      There is a country called Country One located in Island 1.

      There is another country called Country Another located in Island N. 

      There is a war against Country Another, which launched by Country One.

      There is a strategy which can help Country Another to defend this war by destroying the bridges for the purpose of making Island 1 and Island n disconnected.

      There are some different destroying costs of the bridges.

      There is a prophet in Country Another who is clever enough to find the minimum total destroying costs to achieve the strategy.

      There is an architecture in Country One who is capable enough to rebuild a bridge to make it unbeatable or build a new invincible directional bridge between any two countries from the subset of island 2 to island n-1.

      There is not enough time for Country One, so it can only build one new bridge, or rebuild one existing bridge before the Country Another starts destroying, or do nothing if happy.

      There is a problem: Country One wants to maximize the minimum total destroying costs Country Another needed to achieve the strategy by making the best choice. Then what’s the maximum possible result?
 
Input
      There are multiple cases in this problem.

      There is a line with an integer telling you the number of cases at the beginning.

      The are two numbers in the first line of every case, N(4<=N<=100) and M(0<=M<=n*(n-1)/2), indicating the number of islands and the number of bridges.

      There are M lines following, each one of which contains three integers a, b and c, with 1<=a, b<=N and 1<=c<=10000, meaning that there is a directional bridge from a to b with c being the destroying cost.

      There are no two lines containing the same a and b.
 
Output
      There is one line with one integer for each test case, telling the maximun possible result.
 
Sample Input
4
4 0
4 2
1 2 2
3 4 2
4 3
1 2 1
2 3 1
3 4 10
4 3
1 2 5
2 3 2
3 4 3
 
Sample Output
0
2
1
3
 
Source
 

题目大意:

n个岛通过有向边连在一起,countryOne坐落在1号岛上,countryAny坐落在n号岛上,如今1 要进攻 n ,n为了抵御1的攻击,要毁坏边,没条边毁坏要花费,如今1能够在 2-n 随意两个岛上建立一个摧毁不了的边,使得 countryAny 为了抵御进攻最小的花费最大为多少?

解题思路:

首先,最小割能够理解成网络流的流量,第一步 。countryAny肯定要用最小的花费使得图不连通,这个花费就是最小割。

可是,countryOne这个时候能够再建一条边使得图再次连通,所以得找出最小割的边集,边集就是  从 countryOne相邻的点 到 与countryOne不相邻的点 连接的边,

所以。再枚举这条边。加入到残余网络中。求全部答案中最大的与之前的最小割相加就是答案。

解题代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int INF=0x3f3f3f3f;
const int maxn=100,maxm=10000; struct edge{
int u,v,f,next;
}e[maxm+10]; int src,sink,cnt,head[maxn+10];
int visited[maxn+10],marked;
int dist[maxn+10];
int n,m; void adde(int u,int v,int f){
e[cnt].u=u,e[cnt].v=v,e[cnt].f=f,e[cnt].next=head[u],head[u]=cnt++;
e[cnt].u=v,e[cnt].v=u,e[cnt].f=0,e[cnt].next=head[v],head[v]=cnt++;
} void bfs(){
marked++;
for(int i=0;i<=sink;i++) dist[i]=0;
queue <int> q;
visited[src]=marked;
q.push(src);
while(!q.empty()){
int s=q.front();
q.pop();
for(int i=head[s];i!=-1;i=e[i].next){
int d=e[i].v;
if(e[i].f>0 && visited[d]!=marked ){
q.push(d);
dist[d]=dist[s]+1;
visited[d]=marked;
}
}
}
} int dfs(int u,int delta){
if(u==sink) return delta;
else{
int ret=0;
for(int i=head[u];delta && i!=-1;i=e[i].next){
if(e[i].f>0 && dist[e[i].v]==dist[u]+1){
int d=dfs(e[i].v,min(e[i].f,delta));
e[i].f-=d;
e[i^1].f+=d;
delta-=d;
ret+=d;
}
}
return ret;
}
} int maxflow(){
int ret=0;
while(true){
bfs();
if(visited[sink]!=marked) return ret;
ret+=dfs(src,INF);
}
return ret;
} void initial(){
cnt=0;
memset(head,-1,sizeof(head));
marked++;
} void input(){
scanf("%d%d",&n,&m);
src=1,sink=n;
while(m-- >0){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);
}
} void solve(){
int ans=maxflow();
bool f[maxn+10];
memset(f,false,sizeof(f));
queue <int> q;
q.push(src);
f[src]=true;
while(!q.empty() ){
int s=q.front();
q.pop();
for(int i=head[s];i!=-1;i=e[i].next){
int d=e[i].v;
if(e[i].f>0 && !f[d]){
q.push(d);
f[d]=true;
}
}
} vector <edge> v;
for(int i=0;i<cnt;i++) v.push_back(e[i]); int tmp=0;
for(int i=2;i<=n-1;i++){
for(int j=2;j<=n-1;j++){
if( f[i] && ( ! f[j] ) ){
int headu=head[i],headv=head[j]; adde(i,j,INF);
int flow=maxflow();
if(flow>tmp) tmp=flow; cnt-=2;
head[i]=headu,head[j]=headv;
for(int t=0;t<cnt;t++) e[t]=v[t];
}
}
}
cout<<ans+tmp<<endl;
} int main(){
int t;
scanf("%d",&t);
while(t-- >0){
initial();
input();
solve();
}
return 0;
}

HDU 2435 There is a war (网络流-最小割)的更多相关文章

  1. HDU 2435 There is a war Dinic 最小割

    题意是有n座城市,n号城市不想让1号城市可达n号,每条道路有一条毁坏的代价,1号还可以修一条不能毁坏的道路,求n号城市所需的最小代价最大是多少. 毁坏的最小代价就直接求一遍最大流,就是最小割了.而可以 ...

  2. HDU 6214 Smallest Minimum Cut 【网络流最小割+ 二种方法只能一种有效+hdu 3987原题】

    Problem Description Consider a network G=(V,E) with source s and sink t . An s-t cut is a partition ...

  3. 【hdu 4859】海岸线(图论--网络流最小割)

    题意:有一个区域,有'.'的陆地,'D'的深海域,'E'的浅海域.其中浅海域可以填充为陆地.这里的陆地区域不联通,并且整个地图都处在海洋之中.问填充一定浅海域之后所有岛屿的最长的海岸线之和. 解法:最 ...

  4. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  5. 【bzoj3774】最优选择 网络流最小割

    题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...

  6. 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割

    题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...

  7. 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan

    题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...

  8. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  9. 【bzoj4177】Mike的农场 网络流最小割

    题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...

  10. 【bzoj3438】小M的作物 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801522.html 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物 ...

随机推荐

  1. svn和git比较

    svn有哪些优点和缺点? git有哪些优点和缺点? git最突然的优点就是gitflow,开发新的功能都是开一个新分支feature,完成开发新特性,合并到develop分支:提交测试也是新增一个分支 ...

  2. asp.net程序中如何使用皮肤更换的小功能

    写这篇文章,因要往OA系统上添加更换主题的功能,在网上仔细搜索了一下,主要有几种方法可以实现, 第一种:使用原生态javascript+Css来实现,(代码多,看着纠结,对于前台不熟悉的程序员来说看深 ...

  3. 《CSS网站布局实录》学习笔记(二)

    第二章 XHTML与CSS基础 2.1 XHTML基础 XHTML是网页代码的核心内容,标准XHTML代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  4. PHP编程规范

    好的编程规范不仅是对阅读者的负责,也是对自身的负责: ----割---- 一直以来我都是以php函数的风格来写php,所有变量,函数,类都使用小写,单词之间以下划线隔开,一直比较排斥驼峰式的代码规范, ...

  5. 【转】深入理解Java内存模型(三)——顺序一致性

    数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码 ...

  6. 接入淘宝SDK(OneSDK)和支付宝SDK(AlipaySDK)出现 duplicate symbols for architecture i386

    起初我在我的项目中先接入了AlipaySDK,没有出现什么问题,之后想要接入淘宝SDK之后,就出现了duplicate symbols for architecture i386的错误 经过一段时间排 ...

  7. 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯

      第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...

  8. JS滚动条下拉事件

    <script type="text/javascript"> window.onscroll = function(){ var t = document.docum ...

  9. WebStorm 的使用(一)

    WebStorm是一个捷克公司开发的,功能虽然很强大,但UI貌似一直不是东欧人的强项.WebStorm默认的编辑器颜色搭配不算讲究,我看习惯了VS2012的Dark Theme,再看这个顿觉由奢入俭难 ...

  10. win7 64位 python3.4&opencv3.0配置安装

    参考:http://blog.csdn.net/sun7_she/article/details/50051249 一.安装Python 下载Python3.4.2 网址:https://www.py ...