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. ViewData ViewBag ViewModel

    ViewBag 里可以携带dynamic的数据. Model 是从control传过来的模型数据. 我自己感觉ViewBag 可以携带少量的数据,但是我同事喜欢部分页partial 请求,ViewBa ...

  2. 《Qt on Android核心编程》夹

    china-pub在售前,售中环节退房,折扣低! 有朋友想看看<Qt on Android核心编程>的文件夹,So-- 文件夹     <Qt on Android核心编程>文 ...

  3. 玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)

    关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?i ...

  4. android使用XmlPullParser来解析XML文件

    解析下面的一个XML: <?xml version="1.0" encoding="utf-8" ?> <rss><sid> ...

  5. sharepoint 2013 个人网站公共母板页路径地址

    C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\FEATURES\MySiteUnif ...

  6. 一起学习android图像缩放资源 (27)

    效果图: 在平时载入图片时,我会使用SetImageBitmap.setImageResource.BitmapFactory.decodeResource来设置一张图 片通过以上方法来设置图片时.会 ...

  7. xCAT在多卡的物理机上装rhel6当需要人工选择网卡

    问题叙述性说明 今天装了双网卡的物理机器上rhel5如果一切顺利.但是,在安装rhel6时间不能选择安装自己主动网卡,它会弹出一个窗口,让选择em1依然是em2. 问题原因 原因是我在加入节点的时候使 ...

  8. 第三篇——第二部分——第六文 监控SQL Server镜像

    原文:第三篇--第二部分--第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203 要优化, ...

  9. mysql常见操作汇总

    1.Mysql服务突然启不来了,报错: 在分析时发现MySQL Server 5.0\data下面有个名称为用户名,扩展名为.err的文件: 150725 20:01:19 [Note] 自己的安装目 ...

  10. 一个轻量级rest服务器

    RestServer直接发布数据库为json格式提供方法 RestSerRestServer直接发布数据库为json格式 支持MySQL,SqlServer,Oracle直接发布为Rest服务, 返回 ...