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. MXNet在64位Win7下的编译安装

    注:本文原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) 我笔记本配置比较低,想装个轻量级的MXNet试试,装完之后报错,不是有效的应用程序,找不到 ...

  2. 批处理:遍历输出指定后缀格式的文件名.bat

    批处理:遍历输出指定后缀格式的文件名.bat @echo off type nul >C:\result.txt for /r "d:\我的文档\桌面\交接\webservice\We ...

  3. PHP漏洞全解(五)-SQL注入攻击

    本文主要介绍针对PHP网站的SQL注入攻击.所谓的SQL注入攻击,即一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返 ...

  4. 使用Eclipse调试Android Native Application---cocos2d-x + Eclipse + Android + ndk

    纠结很多天的ndk 调试, 终于在 mac  下面顺利完成(注意在windows还是没弄成功,蛋疼...) 调试方法: 1:先google, ndk demo .  把ndk 最基本的hellword ...

  5. 安装edX DevStack

    概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...

  6. 8. Unity异常警告错误处理方法

    一. The AnimationClip 'cube1_anim' used by the Animation component 'Cube1' must be marked as Legacy. ...

  7. 关于百度地图API的地图坐标转换问题

    原文:关于百度地图API的地图坐标转换问题 我在之前的文章利用html5获取经纬度并且在百度地图中显示位置中使用了百度地图的API来显示html5获取的地理位置,在文中我说过这样的话,我说百度地图的准 ...

  8. BZOJ_1600_[Usaco2008_Oct]_建造栅栏_(动态规划)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1600 将长度为n的线段分成4段,长度为整数,围成面积>0的四边形,求方案数. 分析 首先 ...

  9. NOI2010超级钢琴 2

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1296  Solved: 606[Submit][Status ...

  10. 用css控制cellspacing、cellpadding

    用css控制cellspacing.cellpadding 发表于 2006 年 12 月 24 日 由 Silbo 在table中控制单元格之间的间距要用到cellspacing.cellpaddi ...