HDU 3849 无向图求桥

By Recognizing These Guys, We Find Social Networks Useful

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)
Total Submission(s): 2563    Accepted Submission(s): 671

Problem Description

Social Network is popular these days.The Network helps us know about those guys who we are following intensely and makes us keep up our pace with the trend of modern times.
But how?
By what method can we know the infomation we wanna?In some websites,maybe Renren,based on social network,we mostly get the infomation by some relations with those "popular leaders".It seems that they know every lately news and are always online.They are alway publishing breaking news and by our relations with them we are informed of "almost everything".
(Aha,"almost everything",what an impulsive society!)
Now,it‘s time to know what our problem is.We want to know which are the key relations make us related with other ones in the social network.
Well,what is the so-called key relation?
It means if the relation is cancelled or does not exist anymore,we will permanently lose the relations with some guys in the social network.Apparently,we don‘t wanna lose relations with those guys.We must know which are these key relations so that we can maintain these relations better.
We will give you a relation description map and you should find the key relations in it.
We all know that the relation bewteen two guys is mutual,because this relation description map doesn‘t describe the relations in twitter or google+.For example,in the situation of this problem,if I know you,you know me,too.

Input

The input is a relation description map.
In the first line,an integer t,represents the number of cases(t <= 5).
In the second line,an integer n,represents the number of guys(1 <= n <= 10000) and an integer m,represents the number of relations between those guys(0 <= m <= 100000).
From the second to the (m + 1)the line,in each line,there are two strings A and B(1 <= length[a],length[b] <= 15,assuming that only lowercase letters exist).
We guanrantee that in the relation description map,no one has relations with himself(herself),and there won‘t be identical relations(namely,if "aaa bbb" has already exists in one line,in the following lines,there won‘t be any more "aaa bbb" or "bbb aaa").
We won‘t guarantee that all these guys have relations with each other(no matter directly or indirectly),so of course,maybe there are no key relations in the relation description map.

Output

In the first line,output an integer n,represents the number of key relations in the relation description map.
From the second line to the (n + 1)th line,output these key relations according to the order and format of the input.

Sample Input

1
4 4
saerdna aswmtjdsj
aswmtjdsj mabodx
mabodx biribiri
aswmtjdsj biribiri

Sample Output

1
saerdna aswmtjdsj

Source

2011 Invitational Contest Host by BUPT

Recommend

chenyongfu

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<map>
 7 #include<string>
 8 using namespace std;
 9 const int maxn=100007;
10 struct node
11 {
12     int from,to;
13 };
14 node edge[100007*2];
15 int next1[100007*2],first[maxn],pre[maxn],top;
16 int n,m,sum,ans[maxn],anstop;
17 void addedge(int u,int v)
18 {
19     edge[sum].from=u;edge[sum].to=v;
20     next1[sum]=first[u];first[u]=sum;sum++;
21     edge[sum].from=v;edge[sum].to=u;
22     next1[sum]=first[v];first[v]=sum;sum++;
23 }
24 int tarjain(int u,int fa)
25 {
26     int lowu=pre[u]=top++,child=0;
27     for(int i=first[u];i!=-1;i=next1[i])
28     {
29         int v=edge[i].to;
30         if(!pre[v]){
31             child++;
32             int lowv=tarjain(v,u);
33             lowu=min(lowv,lowu);
34             if(pre[u]<lowv){
35                 ans[anstop++]=i;
36             }
37         }
38         else if(pre[v]<lowu&&v!=fa){
39             lowu=min(lowu,pre[v]);
40         }
41     }
42     return lowu;
43 }
44 int main()
45 {
46     ios::sync_with_stdio(false);
47     int t;string s1,s2;int cnt;
48     cin>>t;
49     while(t--){
50         memset(next1,-1,sizeof(next1));
51         memset(first,-1,sizeof(first));
52         memset(pre,0,sizeof(pre));
53         map<string,int> mp1;
54         map<int,string> mp2;
55         cin>>n>>m;
56         cnt=1;anstop=0,sum=0;
57         for(int i=1;i<=m;i++)
58         {
59             cin>>s1>>s2;
60             if(mp1[s1]==0) mp1[s1]=cnt,mp2[cnt]=s1,cnt++;
61             if(mp1[s2]==0) mp1[s2]=cnt,mp2[cnt]=s2,cnt++;
62             addedge(mp1[s1],mp1[s2]);
63         }
64         top=1;
65         tarjain(1,-1);
66         bool flag=1;
67         for(int i=1;i<=n;i++)
68         {
69             if(!pre[i]) flag=0;
70         }
71         if(!flag){cout<<"0"<<endl;continue;}
72         sort(ans,ans+anstop);
73         cout<<anstop<<endl;
74         int k;
75         for(int i=0;i<anstop;i++)
76         {
77             k=ans[i];
78             k=min(k,k^1);
79             cout<<mp2[edge[k].from].c_str()<<" "<<mp2[edge[k].to].c_str()<<endl;
80         }
81     }
82     return 0;
83 }
时间: 2024-10-05 10:37:35

HDU 3849 无向图求桥的相关文章

HDU 4738 无向图求桥

使用tarjan算法求桥,模板题,但是... 1.有重边 2.不一定连通 3.没有人守桥至少要派一个人去 http://acm.hdu.edu.cn/showproblem.php?pid=4738 这种题挺好的,可以锻炼人的耐性和心理承受能力... #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> us

hdu 2242 无向图/求用桥一分为二后使俩个bcc点权值和之差最小并输出 /缩点+2次新图dfs

题意如标题所述, 先无向图缩点,统计出每个bcc权,建新图,然后一遍dfs生成树,标记出每个点(新图)以及其子孙的权值之和.这样之后就可以dfs2来枚举边(原图的桥),更新最小即可. 调试了半天!原来是建老图时候链式前向星和新图的vector<vector< int>>俩种存图搞乱了!!!不可原谅!哎!愚蠢!愚不可及!提交后1A. 后来百度之后,发现说是用树形dp,看了代码解法,竟然和我的是一样的算法..原来这种算法可以叫树形dp...的确有点dp味道..不过感觉不太浓.. 以后多

I - Caocao&#39;s Bridges - hdu 4738(求桥)

题意:曹操的船之间有一些桥连接,现在周瑜想把这些连接的船分成两部分,不过他只能炸毁一座桥,并且每座桥上有士兵看守,问,他最少需要排多少士兵去炸桥如果不能做到,输出‘-1’ 注意:此题有好几个坑,第一个输入桥守卫是0的话也得排一个士兵 如果一开始桥就是不连通的就不用派士兵了,直接输出 0 ************************************************************** #include<stdio.h>#include<string.h>#

UVA 796 Critical Links(无向图求桥)

题目来源: UVa Online Judgehttps://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 求一个连通图中必不可少的路径: #include<stdio.h> #include<algorithm> #include<vector> #include<string.h> #define

POJ 3694 Network(无向图求桥+重边处理+LCA)

题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的处理上要说一下, 我以前第一写的时候根本没考虑这个问题,但是居然过了...过了...  很扯淡,但是重边的问题确实是存在. 这里我们 使用一个 bridge 数组来保存桥, 因为有重边的存在  只有 bridge 数量为 1 的时候这个路径才算是桥,否则则不是桥 bridge[i] 是指  i 和

poj 3694 无向图求桥+lca

题意抽象为: 给一个无向图和一些询问 对于每一次询问: 每次询问都会在图上增加一条边 对于每一次询问输出此时图上桥的个数. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(1 ≤ N ≤ 100,000) ,边数M(N - 1 ≤ M ≤ 200,000),询问数Q ( 1 ≤ Q ≤ 1,000) 先跑一遍tarjan,对边双连通分枝缩一下点. 再维护lca即可. AC代码: #include<cstdio> #include<cstring> #include<

HDU 3849 无向图的割边

By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total Submission(s): 2319    Accepted Submission(s): 603 Problem Description Social Network is popular these

HDU 4738 无向图的桥

Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1876    Accepted Submission(s): 679 Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. Bu

无向图求桥,允许重复边

#include <iostream> #include <map> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #define LL long long #define INF 0x3f3f3f