zzuli 1990 985的「樹」難題

2021-07-22 05:58:07 字數 1358 閱讀 7153

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 每次只可以向下或者向右走一步,問他能...