hihoCoder 1716 繼承順位 DFS

2021-09-01 18:38:03 字數 1383 閱讀 6718

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

h國的國王有很多王子,這些王子各自也都有很多王孫,王孫又各自有很多後代…… 總之,h國王族的族譜形成了一棵以國王為根的樹形結構。  

根據h國的法律,王族的繼承順位這樣規定的:

假設a和b是兩位王族

1. 如果其中一位是另一位的直系父親、祖先,則輩份高的王族繼承順位更高  

2. 否則,假設c是a和b的最近公共祖先。顯然a和b一定是c的兩位不同子嗣的後代。其中c較年長的子嗣的後代的繼承順位更高

按時間順序給出所有國王後代的出生和死亡記錄,請你計算所有還活著的後代的繼承順位。

第一行包含乙個整數n和乙個只包含大寫字母和數字的字串,分別代表記錄的條數和國王的名字。  

以下n行每行包含一條記錄:

birth name1 name2 代表name1的兒子name2出生  

death name 代表name死亡  

1 <= n <= 10000  

名字長度不超過20,並且沒有重名的王族。

按繼承順位從高到低輸出每位王族的名字。(不包括國王)  

每個名字一行。

樣例輸入

4 king  

birth king ali

birth king bob

birth ali carro

death ali

樣例輸出

carro  

bob

先序遍歷,第一次接觸到這樣的stl結合搜尋題,一直在想怎麼接所有子節點,保證先出生的節點以及孩子節點先輸出。直到選拔賽結束才明白把map對映到佇列就可以實現這樣的先序遍歷。

#include #include#include#include#include#include#include#include#define mod 1000000007

#define inf 0x3f3f3f3f

#define bug printf("-------bug------\n")

static const double pi = acos(-1);

using namespace std;

typedef long long ll;

mapvis;

map>mps;

void dfs(string s)

dfs(str); //先序遍歷的表現,繼續找孩子節點

mps[s].pop();

}}int main()

else

}dfs(s);

}return 0;

}

hdu 1716注意格式

排列2 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status description ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些...

POJ 1716 差分約束

include include include include include include include include using namespace std define print x cout define input x cin x define inf 1 30 define si...

P1716 雙調序列

題目描述 電腦組的童鞋們經常玩一些智力pk小遊戲,某月某日,發源於小朋友又發明了一種新的序列 雙調序列,所謂的雙調呢主要是滿足如下條件描述 假定有n n 1000 個整數 都在longint範圍內,即 2147483648 2147483647 雙調序列的第乙個數是n個整數中的最大數,第二個數是n個...