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. linq query, using int.parse to convert varchar to int while orderby

    var t = from x in context.NewsLetterItem.ToList() //add .ToList at this place where x.APPId == appid ...

  2. 关于JS中的apply()与call()使用方法与区别

    Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...

  3. C++ 数据类型及相关问题 及输出精度控制

    1.有哪些数据类型? 2.数据类型在不同的编译器会有不同的位宽,如何得知? 使用如下命令: cout<<sizeof(int)<<endl; cout<<sizeo ...

  4. C#变成数据导入Excel和导出Excel

    excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...

  5. xxx couldn't be loaded because it has not been added to the build settings.

    这个由于没有将进入场景放入Build Settings里面造成的.

  6. Linux下SSH免密码登录

    转自:http://haitao.iteye.com/blog/1744272 ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所 ...

  7. win7安装IIS及将网站发布到IIS上

    1. WIN7安装IIS:  控制面板----程序和功能-----打开或关闭windows功能,如图 展开Internet信息服务,按照下图方式进行选择,然后单击"确定",等待几分 ...

  8. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  9. GL_INTERFACE

    prompt ****************************************************************************** 总账接口主要完成其他模块的总 ...

  10. Android开发之ADT中无Annotation Processin的解决办法

    使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...