ural 1069. Prufer Code

题感觉开始有点看不懂,后来看懂后感觉还是蛮水的。

 

这是一棵树,每次删掉度为1而且编号最小的值,然后输出删掉这个叶子所连的父节点。就这么一直删下去。

 

然后把这个输出给你,让你重建这棵树。

 

输入的话,肯定是原树中不是叶子节点的点,而且度为多少,就输入多少次。比如样例:2 1 6 2 6 。可以推得,原树中6的度为2,2的度为2,1的度为1。然后没出现的肯定是叶子节点,然后从这些点中找编号最小的,比如样例,肯定是3,那么3连的一定是第一个输入2,所以2的度--,如果度减到0,就入队(优先队列)。中间找到的话直接相互存下。因为内存不大,不能用邻接矩阵存了T T 。。。我拿链表存的。最后输出的时候还得按升序,还排了下序T T.。

 

#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 = 7510; typedef struct NODE{ short ind; }NODE; typedef struct MAP{ short num; MAP *next; }MAP; short deg[MAX]; priority_queue<NODE> q; bool operator<(NODE a,NODE b) { return a.ind > b.ind; } MAP *map[MAX],node[MAX*2]; int cou; int a[MAX]; int n; void Add(int from,int to) { node[cou].num = to; node[cou].next = map[from]; map[from] = &node[cou++]; } void BFS() { int k = 1; while( !q.empty() && k < n ) { int now = q.top().ind; q.pop(); Add(now,a[k]); Add(a[k],now); deg[a[k]]--; if( deg[a[k]] == 0 ) { NODE tmp; tmp.ind = a[k]; q.push(tmp); } k++; } } void output(MAP *head) { int ans[MAX],cnt = 0; while( head != NULL ) { ans[cnt++] = head->num; head = head->next; } sort(ans,ans+cnt); for(int i=0; i<cnt; i++) printf(" %d",ans[i]); } int main() { cou = 0; n = 1; memset(deg,0,sizeof(deg)); memset(map,'/0',sizeof(map)); while( ~scanf("%d",&a[n]) ) { deg[a[n]]++; n++; } for(int i=1; i<=n; i++) if( deg[i] == 0 ) { NODE tmp; tmp.ind = i; q.push(tmp); } BFS(); for(int i=1; i<=n; i++) { printf("%d:",i); output(map[i]); printf("/n"); } return 0; } <textarea cols="50" rows="15" name="code" class="cpp">#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 = 7510; typedef struct NODE{ short ind; }NODE; typedef struct MAP{ short num; MAP *next; }MAP; short deg[MAX]; priority_queue<NODE> q; bool operator<(NODE a,NODE b) { return a.ind > b.ind; } MAP *map[MAX],node[MAX*2]; int cou; int a[MAX]; int n; void Add(int from,int to) { node[cou].num = to; node[cou].next = map[from]; map[from] = &node[cou++]; } void BFS() { int k = 1; while( !q.empty() && k < n ) { int now = q.top().ind; q.pop(); Add(now,a[k]); Add(a[k],now); deg[a[k]]--; if( deg[a[k]] == 0 ) { NODE tmp; tmp.ind = a[k]; q.push(tmp); } k++; } } void output(MAP *head) { int ans[MAX],cnt = 0; while( head != NULL ) { ans[cnt++] = head->num; head = head->next; } sort(ans,ans+cnt); for(int i=0; i<cnt; i++) printf(" %d",ans[i]); } int main() { cou = 0; n = 1; memset(deg,0,sizeof(deg)); memset(map,'/0',sizeof(map)); while( ~scanf("%d",&a[n]) ) { deg[a[n]]++; n++; } for(int i=1; i<=n; i++) if( deg[i] == 0 ) { NODE tmp; tmp.ind = i; q.push(tmp); } BFS(); for(int i=1; i<=n; i++) { printf("%d:",i); output(map[i]); printf("/n"); } return 0; }

你可能感兴趣的:(ural 1069. Prufer Code)