ural 1056. Computer Net
2011-05-15 15:21
302 查看
这题,纠结好久了。题意是,给你一颗树,求到达其他端点最远距离最近的点。
昨晚想出来一种方法,但是实现很有问题。就是删度为1的点,一直删到剩下的点度都为1为止。但是这个实现起来很麻烦啊。。。T T 。。
党姐今天说了他的想法,就是找最长链,然后求得的点要么是一个要么是两个,所以肯定是最长链中间的那一个或者两个。找最长链是,随意从一个点出发,找到离它最远的一个点,然后再由这个点找最长链。
刚实现了下,觉得没啥问题,在第九组crash了。。。T T 。。。。以为DFS不行呢,改成BFS依然crash。。。又一看,发现,我建的图的边是双向边 T T。。。数组少开了一半。。。交后A掉 T T 。。
双 DFS
BFS+DFS
昨晚想出来一种方法,但是实现很有问题。就是删度为1的点,一直删到剩下的点度都为1为止。但是这个实现起来很麻烦啊。。。T T 。。
党姐今天说了他的想法,就是找最长链,然后求得的点要么是一个要么是两个,所以肯定是最长链中间的那一个或者两个。找最长链是,随意从一个点出发,找到离它最远的一个点,然后再由这个点找最长链。
刚实现了下,觉得没啥问题,在第九组crash了。。。T T 。。。。以为DFS不行呢,改成BFS依然crash。。。又一看,发现,我建的图的边是双向边 T T。。。数组少开了一半。。。交后A掉 T T 。。
双 DFS
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 10010; typedef struct NODE{ int num; NODE *next; }NODE; NODE *map[MAX],node[2*MAX]; bool used[MAX]; int n,cou; int s; int len,maxlen; int out[MAX]; int t[MAX],p; void init() { memset(used,false,sizeof(used)); memset(map,'/0',sizeof(map)); cou = 0; } void Add(int from,int to) { node[cou].num = to; node[cou].next = map[from]; map[from] = &node[cou++]; } void DFS(int x) { if( len > maxlen ) { maxlen = len; s = x; } used[x] = true; NODE *head = map[x]; while( head != NULL ) { if( !used[head->num] ) { len++; DFS(head->num); len--; } head = head->next; } } void DFS2(int x) { t[len] = x; used[x] = true; NODE *head = map[x]; bool flag = false; while( head != NULL ) { if( !used[head->num] ) { flag = true; len++; DFS2(head->num); len--; } head = head->next; } if( !flag && len > maxlen ) { maxlen = len; memcpy(out,t,sizeof(t)); } } int main() { int to; scanf("%d",&n); init(); for(int i=2; i<=n; i++) { scanf("%d",&to); Add(i,to); Add(to,i); } len = maxlen = 0; memset(used,0,sizeof(used)); DFS(1); memset(used,0,sizeof(used)); len = maxlen = 0; DFS2(s); maxlen++; if( maxlen % 2 == 1 ) printf("%d/n",out[maxlen/2]); else { int a = out[maxlen/2-1]; int b = out[maxlen/2]; printf("%d %d/n",min(a,b),max(a,b)); } return 0; }
BFS+DFS
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 10010; typedef struct NODE{ int num; NODE *next; }NODE; NODE *map[MAX],node[2*MAX]; bool used[MAX]; int n,cou; int s; int len,maxlen; int out[MAX]; void init() { memset(map,'/0',sizeof(map)); cou = 0; } void Add(int from,int to) { node[cou].num = to; node[cou].next = map[from]; map[from] = &node[cou++]; } void DFS(int x) { if( len > maxlen ) { maxlen = len; s = x; } used[x] = true; NODE *head = map[x]; while( head != NULL ) { if( !used[head->num] ) { len++; DFS(head->num); len--; } head = head->next; } } int pre[MAX]; int e; typedef struct LA{ int t,ind;}LA; queue<LA> q; void BFS(int s) { for(int i=0; i<=n; i++) pre[i] = i; LA tmp; tmp.t = 0; tmp.ind = s; q.push(tmp); while( !q.empty() ) { LA tmp = q.front(); q.pop(); if( tmp.t > maxlen ) { maxlen = tmp.t; e = tmp.ind; } NODE *head = map[tmp.ind]; while( head != NULL ) { if( !used[head->num] ) { used[head->num] = true; pre[head->num] = tmp.ind; LA y; y.t = tmp.t+1; y.ind = head->num; q.push(y); } head = head->next; } } } int main() { int to; scanf("%d",&n); init(); for(int i=2; i<=n; i++) { scanf("%d",&to); Add(i,to); Add(to,i); } len = maxlen = 0; memset(used,0,sizeof(used)); DFS(1); memset(used,0,sizeof(used)); maxlen = 0; used[s] = 1; BFS(s); int p = 0; while( pre[e] != e ) { out[p++] = e; e = pre[e]; } out[p++] = e; if( p % 2 == 1 ) printf("%d/n",out[p/2]); else { int a = out[p/2-1]; int b = out[p/2]; printf("%d %d/n",min(a,b),max(a,b)); } return 0; }
相关文章推荐
- URAL 1056 Computer Net(最短路)
- ural 1056 Computer Net(树形DP)需要用到两遍dfs
- URAL 1056 Computer Net
- ural 1056 computer net
- URAL1056 Computer Net
- URAL1056 Computer net
- ural 1056 Computer Net
- ural 1056. Computer Net 树的重心
- URAL1056(树的直径)
- 【URAL 1056】Amount of Degree
- 1056. Computer Net
- Timus OJ 1056. Computer Net
- URAL 1056 Computer net [DFS求树的中心]
- URAL 1056(树形DP)
- URAL - 1056(DFS)
- ural 1057(数位dp)
- Ural 1486. Equal Squares 字符串hash
- Minimal Coverage(ural1303,区间贪心)
- URAL 1009/URAL 1012/URAL 1013
- URAL 1152