某個國家有n個城市,編號0 至 n-1,他們之間用n - 1條道路連線,道路是雙向行駛的,沿著道路你可以到達任何乙個城市。你有乙個旅行計畫,這個計畫是從編號k的城市出發,每天到達乙個你沒有去過的城市,並且旅途中經過的沒有去過的城市盡可能的多(如果有2條路線,經過的沒有去過的城市同樣多,優先考慮編號最小的城市),直到所有城市都觀光過一遍。現在給出城市之間的交通圖t,以及出發地點k,你來設計乙個旅行計畫,滿足上面的條件。
乙個顯然的想法就是把起點k拎起來,那麼第一次一定走最深的葉節點,第二次一定走到根再走向第二深的沒走過的葉節點,如此類推
可以發現每次必定走葉節點,如果不走的話必定能再向下走到葉節點使得到達的點數更多。那麼對於盡可能深的葉節點貪心地向上加點排序輸出即可
說好的樹dp呢c
#include
#include
#include
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define n 100005
#define e 200005
struct edgee[e];
struct post[n];
int dep[n],fa[n],ls[n],d[n],edcnt;
bool vis[n];
int n,root,cnt=0;
void read(int &x)
void addedge(int x,int y) ; ls[x]=edcnt;
e[++edcnt]=(edge); ls[y]=edcnt;
++d[x]; ++d[y];
}void dfs(int now,int father)
if (flag) t[++cnt]=(pos);
}void find(pos &rec,int now)
bool cmp1(pos x,pos y)
rep(i,2,n)
dfs(root,-1);
std:: sort(t+1,t+cnt+1,cmp1);
rep(i,1,cnt) find(t[i],t[i].id);
std:: sort(t+1,t+cnt+1,cmp2);
printf("%d\n",root-1);
rep(i,1,cnt) printf("%d\n",t[i].id-1);
return
0;}
51 nod 1273 旅行計畫 樹DP
1273 旅行計畫 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 某個國家有n個城市,編號0 至 n 1,他們之間用n 1條道路連線,道路是雙向行駛的,沿著道路你可以到達任何乙個城市。你有乙個旅行計畫,這個計畫是從編號k的城市出發,每天到達乙個...
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...
51nod1442 士兵的旅行
裸網路流拆點就可以了。include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define clr x,c mem...