51nod1273 旅行計畫 貪心

2021-08-13 05:37:59 字數 1213 閱讀 9323

某個國家有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...