1021:
1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #include<queue> 5 using namespace std; 6 7 #define N 10005 8 vector<int> v[N]; 9 queue<int> q; 10 int tree[N],h[N],dis[N],vis[N]; 11 int n,maxh; 12 13 int findroot(int x){ 14 if(tree[x]==-1) 15 return x; 16 else{ 17 int tmp=findroot(tree[x]); 18 tree[x]=tmp; 19 return tmp; 20 } 21 } 22 void merge(int x,int y){ 23 x=findroot(x); 24 y=findroot(y); 25 if(x!=y){ 26 tree[x]=y; 27 } 28 } 29 int bfs(int p){ 30 int height=0;; 31 int i,j,k; 32 while(!q.empty()) 33 q.pop(); 34 memset(dis,0,sizeof(dis)); 35 memset(vis,0,sizeof(vis)); 36 q.push(p); 37 vis[p]=1; 38 while(!q.empty()){ 39 k=q.front(); 40 q.pop(); 41 for(i=0;i<v[k].size();i++){ 42 if(!vis[v[k][i]]){ 43 dis[v[k][i]]=dis[k]+1; 44 if(height<dis[v[k][i]]) height=dis[v[k][i]]; 45 q.push(v[k][i]); 46 vis[v[k][i]]=1; 47 } 48 } 49 } 50 if(maxh<height) 51 maxh=height; 52 return height; 53 54 } 55 int main(){ 56 freopen("in2.txt","r",stdin); 57 int x,y; 58 int i,j; 59 scanf("%d",&n); 60 for(i=0;i<N;i++) 61 tree[i]=-1; 62 for(i=0;i<n;i++){ 63 scanf("%d %d",&x,&y); 64 v[x].push_back(y); 65 v[y].push_back(x); 66 merge(x,y); 67 } 68 int cnt=0; 69 maxh=0; 70 for(i=1;i<=n;i++){ 71 if(tree[i]==-1) 72 cnt++; 73 } 74 if(cnt==1){ 75 for(i=1;i<=n;i++){ 76 h[i]=bfs(i); 77 } 78 for(i=1;i<=n;i++){ 79 if(h[i]==maxh) 80 printf("%d ",i); 81 } 82 83 } 84 else 85 printf("Error: %d components",cnt); 86 87 return 0; 88 }
对我来说挑战非常大的一道题,看了很多资料,看了很多方法,找到一个适合自己的代码,一直研究才弄的差不多。。
首先是利用并查集来判断连通分量的个数,这是一个很经典也很方便的方法,希望以后自己能多利用。非常好用,思路也不难。就是利用双亲表示法来表示树,把相关的合并在一起,然后递归找双亲节点,都是固定的东西。
然后就是bfs的东西,这个一直没接触过,第一次还是有很大的压力。各种各样的问题。希望以后再有深刻理解。其实思路并不难,关键是注意细节。
1022:
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<vector> 5 #include<algorithm> 6 #include<string> 7 using namespace std; 8 #define N 10005 9 struct book{ 10 char id[8]; 11 char title[80]; 12 char author[80]; 13 char key[80]; 14 vector<string> keys; 15 char publish[80]; 16 char year[5]; 17 }; 18 vector<book> v; 19 int n,m; 20 bool cmp(book a,book b){ 21 if(strcmp(a.id,b.id)<0) 22 return true; 23 else 24 return false; 25 } 26 void search(char *query){ 27 int i,j; 28 char t[40]; 29 int r=0,flag=0; 30 memset(t,'