The war

Problem Description
In the war, the intelligence about the enemy is very important. Now, our troop has mastered the situation of the enemy's war zones, and known that these war zones can communicate to each other directly or indirectly through the network. We also know the enemy
is going to build a new communication line to strengthen their communication network. Our task is to destroy their communication network, so that some of their war zones can't communicate. Each line has its "cost of destroy". If we want to destroy a line,
we must spend the "cost of destroy" of this line. We want to finish this task using the least cost, but our enemy is very clever. Now, we know the network they have already built, but we know nothing about the new line which our enemy is going to build. In
this condition, your task is to find the minimum cost that no matter where our enemy builds the new line, you can destroy it using the fixed money. Please give the minimum cost. For efficiency, we can only destroy one communication line.
 
Input
The input contains several cases. For each cases, the first line contains two positive integers n, m (1<=n<=10000, 0<=m<=100000) standing for the number of the enemy's war zones (numbered from 1 to n), and the number of lines that our enemy has already build.
Then m lines follow. For each line there are three positive integer a, b, c (1<=a, b<=n, 1<=c<=100000), meaning between war zone A and war zone B there is a communication line with the "cost of destroy " c.
 
Output
For each case, if the task can be finished output the minimum cost, or output ‐1.
 
Sample Input
3 2
1 2 1
2 3 2
4 3
1 2 1
1 3 2
1 4 3
 
Sample Output
-1
3
Hint
For the second sample input: our enemy may build line 2 to 3, 2 to 4, 3 to 4. If they build line 2 to 3, we will destroy line 1 to 4, cost 3. If they build line 2 to 4, we will destroy line 1 to 3, cost 2. If they build line 3 to 4, we will destroy line 1 to 2, cost 1. So, if we want to make sure that we can destroy successfully, the minimum cost is 3.
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  4007 4010 4003 4008 4009 
 

题目大意:

敌人有n个网站相连,如今你能够破坏一条边使得这些点不相连,可是敌人为了阻止你破坏,提前多建了一条边,问你最坏情况下的最小花费是多少?

解题思路:

參考别人博客:点击打开链接

解题代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std; const int maxn=11000;
const int maxm=210000; struct edge{
int u,v,w,next;
edge(int u0=0,int v0=0,int w0=0){
u=u0;v=v0;w=w0;
}
friend bool operator <(edge x,edge y){
return x.w<y.w;
}
}e[maxm]; int n,m,cnt,index,head[maxn],dfn[maxn],low[maxn],color[maxn],nc;
vector <int> vec;
bool mark[maxn];
vector <vector <edge> > dfsmap; void addedge(int u,int v,int w){
e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt++;
} void input(){
nc=0;
cnt=0;
index=1;
vec.clear();
for(int i=0;i<maxn;i++){
head[i]=-1;
dfn[i]=0;
mark[i]=false;
}
int u,v,w;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
} void tarjan(int s,int father){
vec.push_back(s);
dfn[s]=low[s]=index++;
mark[s]=true;
bool flag=true;
for(int i=head[s];i!=-1;i=e[i].next){
int d=e[i].v;
if(d==father && flag){flag=false;continue;}
if(!dfn[d]){
tarjan(d,s);
low[s]=min(low[s],low[d]);
}else if(mark[d]){
low[s]=min(low[s],dfn[d]);
}
}
if(low[s]==dfn[s]){
int d;
nc++;
do{
d=vec.back();
vec.pop_back();
color[d]=nc;
mark[d]=false;
}while(d!=s);
}
} pair <int,int> dfs(int s,int father){
int first=(1<<30),second=(1<<30);
for(int i=0;i<dfsmap[s].size();i++){
int d=dfsmap[s][i].v,w=dfsmap[s][i].w;
if(d==father) continue;
pair <int,int> tmp=dfs(d,s);
if(w<tmp.first) tmp.first=w;
if(tmp.first<first){
second=min(tmp.second,first);
first=tmp.first;
}
else if(tmp.first<second) second=tmp.first;
}
//cout<<s<<"->"<<p1.first<<endl;
return make_pair(first,second);
} void solve(){
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i,-1);
}
dfsmap.clear();
dfsmap.resize(n+4);
edge mine=edge(0,0,(1<<30));
for(int i=0;i<cnt;i++){
int x=color[e[i].u],y=color[e[i].v];
if(x!=y){
dfsmap[x].push_back(edge(x,y,e[i].w));
//cout<<x<<"->"<<y<<":"<<e[i].w<<endl;
if(e[i].w<mine.w) mine=edge(x,y,e[i].w);
}
}
pair <int,int> p1=dfs(mine.u,mine.v);
pair <int,int> p2=dfs(mine.v,mine.u);
int ans=min(p1.second,p2.second);
if(ans>=(1<<30) ) cout<<"-1"<<endl;
else cout<<ans<<endl;
} int main(){
while(scanf("%d%d",&n,&m)!=EOF){
input();
solve();
}
return 0;
}

HDU 4005 The war (图论-tarjan)的更多相关文章

  1. HDU 4005 The war(双连通好题)

    HDU 4005 The war pid=4005" target="_blank" style="">题目链接 题意:给一个连通的无向图.每条 ...

  2. HDU 4005 The war Tarjan+dp

    The war Problem Description   In the war, the intelligence about the enemy is very important. Now, o ...

  3. hdu 4005 The war

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 In the war, the intelligence about the enemy is ...

  4. HDU 4005 The war(边双连通)

    题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 ​ 先对原图边双缩点,然后变成了一棵树.在 ...

  5. HDU 4005 The war 双连通分量 缩点

    题意: 有一个边带权的无向图,敌人可以任意在图中加一条边,然后你可以选择删除任意一条边使得图不连通,费用为被删除的边的权值. 求敌人在最优的情况下,使图不连通的最小费用. 分析: 首先求出边双连通分量 ...

  6. HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

  8. HDU 3969 Hawk-and-Chicken(dfs+tarjan缩点优化,网上最详细解析!!!)

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu 4005(边双连通)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 思路:首先考虑边双连通分量,如果我们将双连通分量中的边删除,显然我们无法得到非连通图,因此要缩点 ...

随机推荐

  1. c++头

    头文件c/c++独特的概念. 首先解释声明和定义的区别. extern int x;这是一个可变x声明,void fun();这是函数fun()声明.class a;这是类a声明. int x;变量x ...

  2. Windows PowerShell 简介

    Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.微软之所以将Powershell 定位为Power,并不是夸大其词,因为它完全支持对象.其可读性,易用性 ...

  3. mysql 多个字段拼接

    Mysql的查询结果行字段拼接,能够用以下两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  4. HDU 2017 一系列统计数据

    一系列统计数据 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. linux shell中间$0,$?,$!和&lt;&lt;&#39;END&#39;

    变量说明: $$ Shell自己PID(ProcessID) $! Shell背景上次执行Process的PID $? 最后执行的命令结束码(回报值) $- 使用Set命令设定的Flag一览 $* 全 ...

  6. Tomcat—怎样在Tomcat Webserver下部署Web项目

            总结一下怎样在Tomcat Webserver下部署Web项目:

  7. Android ImageView分析并展开

    版本号:1.0  日期:2014.6.11 2014.6.12 版权:© 2014 kince 转载注明出处   ImageView是开发中经常使用到的一个控件,也能够说是不可缺少的. 对于它的使用. ...

  8. ios崩溃日志1

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not loa ...

  9. android代码集EditText只要输入号码、信

     如何设置EditText,因此,只有某些数字或字母可以进入它? 一.建立EditText,只要输入号码: 办法1:直接生成DigitsKeyListener了. et_1.setKeyListe ...

  10. MEF初体验之九:部件生命周期

    理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...