985給你一棵「樹」以及它的根節點,要求你先判定它是否是一棵樹,其次他想知道每個節點的「太子」數目以及它的父親(root的話輸出自己)。
「太子判定條件」:
一、若x是y的孩子節點,那麼x是y的「太子」;
二、若x是y的「太子」且y是z的「太子」,那麼x是z的「太子」。
第一行輸入乙個整數t,代表有t組測試資料。
每組資料第一行輸入兩個整數n,root分別代表樹的節點數目以及根節點的編號。
接下來n-1行,每行輸出兩個整數u,v代表u節點和v節點之間有一條樹邊。
注:1 <= t <= 20,1 <= n <= 1e4,1 <= root <= n,1 <= u,v <= n。
對每一組資料,若給定的「樹」不合法輸出no即可,反之輸出yes,接下來輸出佔兩行:
第一行輸出n個整數代表每個節點的「太子」數目,
第二行輸出n個整數代表每個節點的父親節點編號。
輸出順序從1到n,每兩個數之間有乙個空格,最後乙個數後面沒有空格。
23 11 22 32 11 1
yes
2 1 0
1 1 2 no
要用都鄰接表,我用的是-鏈式向前星。
加上並查集,dfs其實就是從根節點把鄰接表跑一遍。
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define ll long long
#define n 10010
#define mod 1000000007
struct node
a[n];
int head[n],v[n],s[n],f[n],t;
void add(int to,int w)
//以上是鄰接表(靜態建表,鏈式向前星)
int findd(int x)
}//並查集
void dfs(int to)
}}//遍歷一遍把能連起來的標記一下。
int main()
{ int t,n,root;
scanf("%d",&t);
while(t--)
{scanf("%d%d",&n,&root);
int to,w,flag=1;
t=1;
memset(head,-1,sizeof(head));
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
f[i]=i,s[i]=0;
for(int i=1;i
zzuli 1198 985的數字難題
985的數字難題 985有n個數,已知每次操作可以將其中不相同的兩個數乙個加 一 乙個減一,操作次數不限。問他最多可以得到多少個相同的數。第一行輸入乙個整數t,代表有t組測試資料。每組資料佔兩行,第一行輸入乙個n代表元素個數,下面一行輸入n個整數a。注 1 t 30,1 n 1e4,1 a 1e3。...
zzuli 1894 (985的方格難題)
dp 985的方格難題 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能否到達 n,n 若不能到達輸出 1,反之輸出到達 n,n 的方案數。第一行輸入乙個整數t,代表有t組測試資料。每組資料第一行輸入三個整數n,...
zzuli1894 985的方格難題
time limit 1 sec memory limit 128 mb submit 436 solved 95 submit status web board 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能...