hdu 4005 The war
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<algorithm>
- #include<vector>
- #define inf 0x7fffffff
- using namespace std;
- const int maxn=+;
- const int M = 2e5+;
- int n,m;
- struct Edge
- {
- int u,v,cost;
- int next;
- }edge[M];
- int head[maxn],edgenum;
- void add(int u,int v,int cost)
- {
- Edge E={u,v,cost,head[u] };
- edge[edgenum]=E;
- head[u]=edgenum++;
- Edge E1={v,u,cost,head[v] };
- edge[edgenum]=E1;
- head[v]=edgenum++;
- }
- int pre[maxn],low[maxn],dfs_clock,bcc_cnt,index;
- int mark[maxn];
- vector< vector<Edge> > dfsmap;
- vector<int> vec;
- int color[maxn];
- int dfs(int u,int fa)
- {
- low[u]=pre[u]= ++dfs_clock;
- int flag=;
- for (int i=head[u] ;i!=- ;i=edge[i].next)
- {
- int v=edge[i].v;
- if (v==fa && flag) {flag=;continue; }
- if (!pre[v])
- {
- dfs(v,u);
- low[u]=min(low[u],low[v]);
- }
- else if (pre[v]<pre[u])
- low[u]=min(low[u],pre[v]);
- }
- }
- void tarjan(int u,int fa){
- vec.push_back(u);
- pre[u]=low[u]=index++;
- mark[u]=true;
- bool flag=true;
- for(int i=head[u] ;i!=- ;i=edge[i].next){
- int d=edge[i].v;
- if(d==fa && flag){flag=false;continue;}
- if(!pre[d]){
- tarjan(d,u);
- low[u]=min(low[u],low[d]);
- }else {
- low[u]=min(low[u],pre[d]);
- }
- }
- if(low[u]==pre[u]){
- int d;
- bcc_cnt++;
- do{
- d=vec.back();
- vec.pop_back();
- color[d]=bcc_cnt;
- mark[d]=false;
- }while(d!=u);
- }
- }
- void find_bcc()
- {
- memset(pre,,sizeof(pre));
- memset(low,,sizeof(low));
- memset(mark,false,sizeof(mark));
- vec.clear();
- dfs_clock=bcc_cnt=;
- index=;
- for (int i= ;i<=n ;i++)
- if (!pre[i]) tarjan(i,-);
- }
- int mindistance;
- pair<int,int> dfs2(int u,int fa)
- {
- int first=inf,second=inf;
- for (int i= ;i<dfsmap[u].size() ;i++)
- {
- int v=dfsmap[u][i].v;
- int w=dfsmap[u][i].cost;
- if (v==fa) continue;
- pair<int,int> tmp=dfs2(v,u);
- if (tmp.first>w) swap(tmp.first,w);
- //if (second>w) second=w;
- if (tmp.first<first)
- {
- second=min(tmp.second,first);
- first=tmp.first;
- }
- else if (tmp.first<second) second=tmp.first;
- }
- return make_pair(first,second);
- }
- int main()
- {
- int a,b,c;
- while (scanf("%d%d",&n,&m)!=EOF)
- {
- memset(head,-,sizeof(head));
- edgenum=;
- for (int i= ;i<m ;i++)
- {
- scanf("%d%d%d",&a,&b,&c);
- add(a,b,c);
- }
- find_bcc();
- cout<<endl<<bcc_cnt<<endl;
- for (int i= ;i<=n ;i++)
- cout<<i<<" "<<low[i]<<" "<<color[i]<<endl;
- cout<<endl;
- dfsmap.resize(n+);
- for (int i= ;i<n+ ;i++) dfsmap[i].clear();
- int mindist=inf,uu=,vv=;
- for (int i= ;i<edgenum ;i++)
- {
- int u=edge[i].u;
- int v=edge[i].v;
- int w=edge[i].cost;
- int u1=color[u] ,v1=color[v] ;
- if (u1 != v1)
- {
- Edge E={u1,v1,edge[i].cost };
- dfsmap[u1].push_back(E);
- if (edge[i].cost<mindist)
- {
- mindist=edge[i].cost;
- uu=u1 ;vv=v1 ;
- }
- }
- }
- // for (int i=1 ;i<=n ;i++)
- // {
- // int u=low[i];
- // for (int j=head[i] ;j!=-1 ;j=edge[j].next)
- // {
- // int v=low[edge[j].v ];
- // if (u!=v)
- // {
- // Edge E={u,v,edge[j].cost };
- // dfsmap[u].push_back(E);
- // if (edge[j].cost<mindist)
- // {
- // mindist=edge[j].cost;
- // uu=u ;vv=v ;
- // }
- // }
- // }
- // }
- mindistance=inf;
- pair<int,int> p1=dfs2(uu,vv);
- pair<int,int> p2=dfs2(vv,uu);
- //pair<int,int> p1=dfs3(uu,vv);
- //pair<int,int> p2=dfs3(vv,uu);
- mindistance=min(mindistance,min(p1.second,p2.second));
- printf("%d\n",mindistance==inf ? - : mindistance);
- }
- return ;
- }
后续:感谢大牛提出宝贵的意见。。。。
hdu 4005 The war的更多相关文章
- HDU 4005 The war(双连通好题)
HDU 4005 The war pid=4005" target="_blank" style="">题目链接 题意:给一个连通的无向图.每条 ...
- HDU 4005 The war Tarjan+dp
The war Problem Description In the war, the intelligence about the enemy is very important. Now, o ...
- HDU 4005 The war (图论-tarjan)
The war Problem Description In the war, the intelligence about the enemy is very important. Now, our ...
- HDU 4005 The war 双连通分量 缩点
题意: 有一个边带权的无向图,敌人可以任意在图中加一条边,然后你可以选择删除任意一条边使得图不连通,费用为被删除的边的权值. 求敌人在最优的情况下,使图不连通的最小费用. 分析: 首先求出边双连通分量 ...
- HDU 4005 The war(边双连通)
题意 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 先对原图边双缩点,然后变成了一棵树.在 ...
- hdu 4005(边双连通)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 思路:首先考虑边双连通分量,如果我们将双连通分量中的边删除,显然我们无法得到非连通图,因此要缩点 ...
- hdu 4005 双联通 2011大连赛区网络赛E *****
题意: 有一幅图,现在要加一条边,加边之后要你删除一条边,使图不连通,费用为边的费用,要你求的是删除的边的最小值的最大值(每次都可以删除一条边,选最小的删除,这些最小中的最大就为答案) 首先要进行缩点 ...
- hdu 4005 边连通度与缩点
思路:先将图进行缩点,建成一颗树,那么如果这是一条单路径树(即最大点度不超过2),就不在能删的一条边,使得不连通.因为将其头尾相连,形成一个圈,那么删任意一条边,图都是连通的. 上面的是无解的情况,如 ...
- HDU 4070 Phage War
贪心,t 大的放到前面...因为感染所有cell需要的phage的总数是一定的,所以产生phage需要的时间是一定的,只需要考虑用来感染的时间,这样考虑的话,把 t 小的放后面的话,可以发现总时间的最 ...
随机推荐
- 关于ASP.net TextBox控件的失去焦点后触发其它事件
编写人:CC阿爸 2015-2-02 今天在这里,我想与大家一起分享如何处理的ASP.net TextBox控件的失去焦点后触发其它事件的问题,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习 ...
- LevelDB系列之SSTable(Sorted Strings Table)文件
SSTable是Bigtable中至关重要的一块,对于LevelDb来说也是如此,对LevelDb的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节. 本节内容主要讲述SSTab ...
- 将数组之中的省份市区地区ID改成对用中文字符
数据表数据源的省市区联动: 原始数据: //获取所有学校信息 $school=D('school'); $info=$school->getList(); 数据如下: 1 => array ...
- 图片来自腾讯,未经授权不可引用,js解决方法
问题记录,解决后来更新 js伪造Referer, 外链图片让用户浏览时,不发送 referer 字段给原网站的方法 A 网站引用了 B 站的 图片 <img src="b_url&qu ...
- PHP 下载文件时自动添加bom头的方法
首先弄清楚,什么是bom头?在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order ...
- Laravel 5 基础(九)- 表单
首先让我们修改路由,能够增加一个文章的发布. Route::get('articles/create', 'ArticlesController@create'); 然后修改控制器 public fu ...
- 清理sql2000查询分析器登录名记录
注册表 HKEY_CURRENT_USER/Software/Microsoft/Microsoft SQL Server/80/Tools/Client/PrefServers
- 解决Genymotion下载设备失败的方法(Connection Timeout)
一直下载不下来,报错. 解决办法: 打开 C:\Users\用户名\AppData\Local\Genymobile目录 打开genymotion.log文件,在里面最下面几行,找到如下日志 [Deb ...
- Unicode字符以16进制表示
int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个 ...
- xcode plugin
http://alcatraz.io/ https://github.com/macoscope/CodePilot prepo curl -fsSL https://raw.githubuserc ...