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): 2885    Accepted Submission(s):
726

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
 
第一次直接用数组处理字符串  超时了   这是超时代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define MAX 100100
#define INF 0x7fffff
using namespace std;
int n,m;
int head[MAX],ans;
int dfn[MAX],low[MAX];
int dfsclock;
char str1[50],str2[50];
char p[MAX][20];
int num,mark;
char ant[MAX][20],ano[MAX][20];
struct node
{
int beg,end,next;
}edge[MAX];
void init()
{
ans=num=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
node E={u,v,head[u]};
edge[ans]=E;
head[u]=ans++;
}
void getmap()
{
int i,j,a,b;
int sum=1;
for(i=1;i<=m;i++)
{
scanf("%s%s",str1,str2);
int x,y;
x=y=INF;
a=b=0;
for(j=1;j<sum;j++)
{
if(strcmp(str1,p[j])==0)
{
x=j;
a=j;
}
if(strcmp(str2,p[j])==0)
{
y=j;
b=j;
}
if(x!=INF&&y!=INF)
break;
}
if(x==INF)
{
x=sum++;
a=x;
strcpy(p[x],str1);
}
if(y==INF)
{
y=sum++;
b=y;
strcpy(p[y],str2);
}
add(a,b);
add(b,a);
}
}
void tarjan(int u,int fa)
{
int i,v;
low[u]=dfn[u]=++dfsclock;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].end;
if(v==fa)
continue;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
strcpy(ant[num],p[edge[i].beg]);
strcpy(ano[num++],p[edge[i].end]);
}
}
else
low[u]=min(low[u],dfn[v]);
}
}
void find()
{
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
dfsclock=0;
tarjan(1,-1);
mark=0;
for(i=1;i<=n;i++)
{
if(!dfn[i])
{
mark=1;
break;
}
}
}
void solve()
{
int i,j;
if(mark)
{
printf("0\n");
return ;
}
printf("%d\n",num);
for(i=0;i<num;i++)
{
printf("%s %s\n",ant[i],ano[i]);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
getmap();
find();
solve();
}
return 0;
}

  后来看别人都是用的map处理  我不会用map 苦逼啊

#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<stack>
#include<map>
#define MAX 200010
#define INF 0x7fffff
using namespace std;
int n,m;
int head[MAX],ans;
int dfn[MAX],low[MAX];
int dfsclock;
char str1[50],str2[50];
map<string, int>q1;
map<int, string>q2;
int num,mark,bridge;
struct node
{
int beg,end,cnt,next;
}edge[MAX];
void init()
{
ans=num=bridge=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
node E={u,v,0,head[u]};
edge[ans]=E;
head[u]=ans++;
}
void getmap()
{
int i,j,a,b;
int sum=1;
q1.clear();
q2.clear();
for(i=1;i<=m;i++)
{
scanf("%s%s",str1,str2);
if(q1[str1]==0)//貌似是因为map中都是一对一的情况,即同一个字符串不可能重复出现
{
q1[str1]=sum;
q2[sum]=str1;
sum++;
}
if(q1[str2]==0)
{
q1[str2]=sum;
q2[sum]=str2;
sum++;
}
add(q1[str1],q1[str2]);
add(q1[str2],q1[str1]);
}
}
void tarjan(int u,int fa)
{
int i,v;
low[u]=dfn[u]=++dfsclock;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].end;
if(v==fa)
continue;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
edge[i].cnt=edge[i^1].cnt=1;
bridge++;
}
}
else
low[u]=min(low[u],dfn[v]);
}
}
void find()
{
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
dfsclock=0;
tarjan(1,-1);
mark=1;
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
mark=0;
return ;
}
}
}
void solve()
{
int i,j;
if(mark==0)
printf("0\n");
else
{
printf("%d\n",bridge);
for(i=0;i<ans;i=i+2)
{
if(edge[i].cnt==1)
printf("%s %s\n",q2[edge[i].beg].c_str(),q2[edge[i].end].c_str());
} //我查了map的常用函数,但是没找到这个.c_str .......
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
getmap();
find();
solve();
}
return 0;
}

  

 

hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful【双连通分量求桥&&输出桥&&字符串处理】的更多相关文章

  1. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful(双连通)

    HDU 3849 By Recognizing These Guys, We Find Social Networks Useful pid=3849" target="_blan ...

  2. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 1000ms Memory Limit: 65536KB T ...

  3. hdu3849-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)     ...

  4. HDU3849-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)     ...

  5. hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

  6. hdoj 4738 Caocao's Bridges【双连通分量求桥】

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 3849 (双联通求桥)

    一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...

  8. hdoj 3336 Count the string【kmp算法求前缀在原字符串中出现总次数】

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdoj 2222 Keywords Search 【AC自己主动机 入门题】 【求目标串中出现了几个模式串】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

随机推荐

  1. Extjs4.2 多选下拉框

    //多选下拉框 Ext.define('MDM.view.custom.MultiComboBox', { extend: 'Ext.form.ComboBox', alias: 'widget.mu ...

  2. Javascript 5种方法实现过滤删除前后所有空格

    第一种:循环检查替换 //供使用者调用 function trim(s){ return trimRight(trimLeft(s)); } //去掉左边的空白 function trimLeft(s ...

  3. UGUI-组件

    2015-06-22 UGUI 组件 Canvas 画布 The Canvas component represents the abstract space in which the UI is l ...

  4. Highcharts资料

    对应的API:   http://api.hcharts.cn/#chart.events 对应的中文网实例:http://www.hcharts.cn/demo/highcharts/dynamic ...

  5. ruby的gem和boundle安装解决办法

    gem和boundle安装在国内被墙,淘宝提供了淘宝提供了RubyGems的国内镜像站点,解决办法是: 对于gem: $ gem sources --remove https://rubygems.o ...

  6. urllib2.urlopen超时问题

    urllib2.urlopen超时问题 没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给ur ...

  7. .net和MVC中的json值和List<T>和DataTable的一些转换

    1.List<T>集合转换为Json值 List<ReportModel> dtList = new List<ReportModel>(); JsonResult ...

  8. 保护模式下GDTR,LDTR,全局描述符表,局部描述符表和选择器的关系

    这张图要注意:右边两个0-15,其中上面的是LDTR,  下面的是选择子. 图下第五个标线,是两个线交叉的,实际上第五个线是指向右边水平的那个线. 没有箭头的两组线分别表示GDT的区间,LDT的区间 ...

  9. 李洪强漫谈iOS开发[C语言-024]-表达式与赋值运算符

  10. C# Eval在asp.net中的用法及作用

    Eval( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定,bind是双向绑定,但需数据源支持 ASP.NET 2.0改善了模板中的数据绑定操 ...