CodeForces D. Choosing Capital for Treeland (转化为树形DP)
来源:互联网 发布:chrome 无法调用 java 编辑:程序博客网 时间:2024/06/05 23:48
恭喜一下自己……这题没看题解做出来的(虽然思路不小心瞄到了一眼)
题意:给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到u去,则要逆转该边方向)如果有多个这样的点,则升序输出所有
思路:把边的方向化为权值,正向为1,逆向为0。
问题转化为找哪些点的在遍历全图后总权值最大。
这就是树形DP了,考虑每个节点,它可以从子树收获价值,也可以从父亲收获。所以dfs两遍,一边把子树的价值存到dps[i]里,再一遍把父亲的价值存到dpf[i]里。ans[i] = dps[i] + dpf[i]。这都是老套路了!
按照题意再想个办法记录一下哪些点是最大。
总的来说这题还是简单
【代码】
/* ***********************************************Author :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k) memset(a,k,sizeof(a))#define LL long long#define N 200005#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}struct Edge{ int v,w,next;}edge[N*2];int head[N],tot;void addedge(int u,int v,int w){ edge[tot] = (Edge){v,w,head[u]}; head[u] = tot++;}int dps[N],dpf[N];void dfs(int u,int fa){ for(int i=head[u]; ~i;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(v==fa) continue; dfs(v,u); dps[u] += w; dps[u] += dps[v]; }}void dfs2(int u,int fa){ for(int i=head[u]; ~i;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(v==fa) continue; dpf[v] = dpf[u] + (w?0:1) + dps[u] - dps[v] - w; dfs2(v,u); }}struct node{ int v,id;}ans[N];bool cmp(node a,node b){ return a.v>b.v || a.v==b.v&&a.id<b.id;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n; scan(n); mst(head,-1); tot=0; int u,v; REP(i,1,n) { scann(u,v); addedge(u,v,1); addedge(v,u,0); } mst(dps,0); dfs(1,-1); dfs2(1,-1); for(int i=1;i<=n;i++) { ans[i].v = dps[i]+dpf[i]; ans[i].id = i; //printf("i=%d %d %d\n",i,dps[i],dpf[i]); } sort(ans+1,ans+n+1,cmp); int num=1; int sum = n-1 - ans[1].v; for(int i=2;i<=n;i++) if(ans[i].v==ans[1].v) num++; printf("%d\n",sum); for(int i=1;i<=num;i++) printf("%d%c",ans[i].id,i==num?'\n':' '); return 0;}
0 0
- CodeForces D. Choosing Capital for Treeland (转化为树形DP)
- CodeForces 219D Choosing Capital for Treeland (树形dp)
- codeforces 219D Choosing Capital for Treeland(树形DP)
- CodeForces 219D Choosing Capital for Treeland(树形DP)
- codeforces 219D D. Choosing Capital for Treeland(树形dp)
- CodeForces 219D Choosing Capital for Treeland | 树形dp
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
- CodeForces 219D Choosing Capital for Treeland (树形DP)
- codeforces 218D Choosing Capital for Treeland 树形DP
- codeforces 219D Choosing Capital for Treeland (树形dp)
- 【树形DP】codeforces 219D Choosing Capital for Treeland
- CF 219 D Choosing Capital for Treeland(树形dp)
- CF 219D Choosing Capital for Treeland (树形dp)
- CF 219D Choosing Capital for Treeland (树形dp)
- CF#219 D. Choosing Capital for Treeland(树形DP)
- Choosing Capital for Treeland (树形dp)
- Codeforces Round #135 (Div. 2) - D. Choosing Capital for Treeland(dfs / 树形DP)
- 树形dp 219D Choosing Capital for Treeland
- 欢迎使用CSDN-markdown编辑器
- app上架报错90362
- Andorid 小心 .getText().equals("")和.getText().toString().equals("")
- 冒泡排序
- 欢迎使用CSDN-markdown编辑器
- CodeForces D. Choosing Capital for Treeland (转化为树形DP)
- 生产者/消费者模式(阻塞队列)
- 如何用js或则jquery过滤特殊字符
- BlackHat2016——JDNI注入/LDAP Entry污染攻击技术研究
- jquery 省份选择器
- Java Map的一点知识点
- OpenAM Web Policy Agent Release Notes---笔记
- n的思想计数器思想万能法
- android studio 中去除actionbar 标题栏的方法。requestWindowFeature(Window.FEATURE_NO_TITLE)无效