hdu 3849 (双联通求桥)
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,,
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <string>
#include <algorithm>
#define N 10001
using namespace std;
int head[N],num,dfs[N],low[N],n,m,idx,bridge[N],bum;
struct edge
{
int st,ed,next;
}E[N*20];
void addedge(int x,int y)
{
E[num].st=x;
E[num].ed=y;
E[num].next=head[x];
head[x]=num++;
}
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void Tarjan(int u,int father)
{
int i,v;
low[u]=dfs[u]=idx++;
for(i=head[u];i!=-1;i=E[i].next)
{
v=E[i].ed;
if(v==father)continue;
if(dfs[v]==-1)
{
Tarjan(v,u);
low[u]=low[u]>low[v]?low[v]:low[u];
if(low[v]>dfs[u])//桥
{
bridge[bum++]=i;
}
}
else low[u]=low[u]>dfs[v]?dfs[v]:low[u];
}
}
int main()
{
int i,x,y,j,t,sum;
char str[2][200];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
num=0;sum=1;
map<string,int>mp;
map<int,string>mmp;
for(i=0;i<m;i++)
{
scanf("%s%s",str[0],str[1]);
if(mp[str[0]]==0)
{
mp[str[0]]=sum;
mmp[sum]=str[0];
sum++;
}
if(mp[str[1]]==0)
{
mp[str[1]]=sum;
mmp[sum]=str[1];
sum++;
}
x=mp[str[0]];
y=mp[str[1]];
addedge(x,y);
addedge(y,x);
}
memset(dfs,-1,sizeof(dfs));
idx=0;
bum=0;
Tarjan(1,-1);
for(i=1;i<=n;i++)
{
if(dfs[i]==-1)
break;
}
if(i<=n){printf("0\n");continue;}
printf("%d\n",bum);
qsort(bridge,bum,sizeof(bridge[0]),cmp);
for(j=0;j<bum;j++)
{
i=bridge[j];
i=(i/2*2);
x=E[i].st;
y=E[i].ed;
if(x!=y)
printf("%s %s\n",mmp[E[i].st].c_str(),mmp[E[i].ed].c_str());
}
}
return 0;
}
hdu 3849 (双联通求桥)的更多相关文章
- hdu 4738 (双联通求桥)
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...
- HDU3394 Railway —— 点双联通分量 + 桥(割边)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 Railway Time Limit: 2000/1000 MS (Java/Others) ...
- 【HDU4612】 双连通分量求桥
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:给你一个无向图,问你加一条边后最少还剩下多少多少割边. 解题思路:好水的一道模板题.先 ...
- hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...
- hdu 4612 双联通缩点+树形dp
#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...
- hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful【双连通分量求桥&&输出桥&&字符串处理】
By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others) ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
随机推荐
- MFC字体与文本输出
字体 成员函数 1.CFont( ); 构造一个CFont对象.此对象在使用之前应该先使用CreateFont.CreateFontIndirect.CreatePointFont或CreatePoi ...
- 检查ept
cat /proc/cpuinfo | grep ept 检查cpu是否支持ept cat /sys/module/kvm_intel/p ...
- 【成都GamEver游戏公司诚邀服务器伙伴】【7~15k一年4次项目奖金】
关于我们 我们厌倦了朝九晚五,一眼看到头的人生我们厌倦了耗费自己青春做的都是没有感情的项目平均从业经验5年以上行业顶尖美术和金牌制作人,资深欧美制作经验立志做中国的suppercell,公司小而美 我 ...
- hdfs[命令] fsck
Usage: DFSck <path> [-list-corruptfileblocks | [-move | -delete | -openforwrite] [-files [-blo ...
- 内核源码分析之tasklet(基于3.16-rc4)
tasklet是在HI_SOFTIRQ和TASKLET_SOFTIRQ两个软中断的基础上实现的(它们是在同一个源文件中实现,由此可见它们的关系密切程度),它的数据结构和软中断比较相似,这篇博文将分析t ...
- Maven管理多模块项目
首先,我们要明确的多模块项目的含义,它是指一个应用中包含多个module.一般来说,一个应用单独部署成服务,只是打包的时候,maven会把各个module组合在一起.各模块一般单独打成jar放到lib ...
- CentOS安装XRDP实现远程桌面访问
1.配置环境: yum install gcc pam-devel openssl-devel -y 2.进入指定目录下载并解压xrdp: 先安装 wget; sudo yum -y install ...
- 用java获取歌曲文件的专辑封面元信息
几个个软件: 1, Jaudioatgger: 链接 2, mp3agic 链接 3, Java mp3 id3 tag library (推荐用上面两个) 其它: android-midi-lib
- vector 之 find 重载
众所周知,map有find,但vector的find只能调用algorithm中的find通用方法. 参考<How to find an item in a std::vector?> 对 ...
- Eclipse查找类路径快捷方式
直接ctrl+shift+t查找这个类,下面会显示类的路径,包括jar名