Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
Total Submission(s): 2885 Accepted Submission(s):
726
#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【双连通分量求桥&&输出桥&&字符串处理】
原文:http://www.cnblogs.com/tonghao/p/4869529.html