九度oj 1468 Sharing 2012年浙江大学计算机及软件工程研究生机试真题
题目1468:Sharing
分析:
如果有公共节点,则第一个公共节点必同时作为两个节点的后驱,且该两个节点分别属于a,b字符串。因此,只要统计后继节点的出现次数,如果有出现两次的节点,则该节点即为所求。
另外,还要注意最后的输出格式问题。
1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int ex[100005]; 9 int main(){ 10 int f1,f2,n; 11 while(cin>>f1>>f2>>n){ 12 int get=-1; 13 int i; 14 int f; 15 char c; 16 memset(ex,0,sizeof(ex)); 17 for(i=0;i<n;i++){ 18 cin>>f; 19 cin>>c; 20 cin>>f; 21 if(f==-1||get!=-1){ 22 continue; 23 } 24 ex[f]+=1; 25 if(ex[f]==2){ 26 get=f; 27 } 28 } 29 if(get==-1){ 30 cout<<get<<endl; 31 } 32 else{ 33 printf("%05d\n",get);//格式问题注意!! 34 } 35 } 36 return 0; 37 }
网上找的做法:
思想可以借鉴:
1.a=node[a];
2.出现了两次的点就是所求
1 #include<iostream> 2 #include<vector> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 const int MAXN=100000; 7 int flag[MAXN]; 8 int node[MAXN]; 9 int main() 10 { 11 #ifdef ONLINE_JUDGE 12 #else 13 freopen("D:\\in.txt","r",stdin); 14 freopen("D:\\out.txt","w",stdout); 15 #endif 16 int ad1,ad2,N; 17 scanf("%d%d%d",&ad1,&ad2,&N); 18 int a(0),b(0); 19 memset(node,0,sizeof(node)); 20 memset(flag,0,sizeof(flag)); 21 char c; 22 while(N--) 23 { 24 scanf("%d %c %d",&a,&c,&b); 25 node[a]=b; 26 } 27 a=ad1; 28 while(a!=-1) 29 { 30 flag[a]=1; 31 a=node[a]; 32 } 33 b=ad2; 34 //while(b!=-1&&!flag[b]) 35 while(!flag[b]&&b!=-1) 36 { 37 //flag[b]=1; 38 b=node[b]; 39 } 40 if(b!=-1) 41 printf("%05d\n",b);//格式问题呀!!!一定要注意!!! 42 else 43 printf("-1\n"); 44 return 0; 45 }