您的位置:首页 > 其它

Educational Codeforces Round 35 (Rated for Div. 2) F. Tree Destruction(dfs)

2017-12-30 23:00 495 查看
题目链接:http://codeforces.com/contest/911/problem/F

策略就是先删除非直径的点,然后删除直径上的点,dfs就行

代码:

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
struct edge
{
int v,nxt;
}E[MAXN*2];
struct Ans
{
int a,b,c;
Ans(int _a=0,int _b=0,int _c=0):a(_a),b(_b),c(_c){}
};
bool book[MAXN];
int head[MAXN],d[MAXN],id[MAXN];
int n,tot,mx,rt1,rt2;
ll res;
vector<Ans> ans;
void init()
{
tot=0;res=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
E[tot].v=v;E[tot].nxt=head[u];head[u]=tot++;
E[tot].v=u;E[tot].nxt=head[v];head[v]=tot++;
}
bool dfspath(int now,int fa,int root)
{
if(now==root)
{
return book[now]=true;
}
for(int i=head[now];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==fa)
continue;
if(dfspath(v,now,root))
return book[now]=true;
}
return false;
}
void dfsroot(int now,int fa,int dis,int &root)
{
if(dis>mx)
{
mx=dis;
root=now;
}
for(int i=head[now];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==fa)
continue;
dfsroot(v,now,dis+1,root);
}
}
void dfsdis(int now,int fa,int dis,int root)
{
if(dis>d[now])
{
d[now]=dis;
id[now]=root;
}
for(int i=head[now];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==fa)
continue;
dfsdis(v,now,dis+1,root);
}
}
void dfsans(int now,int fa,bool flag,int root)
{
if(flag&&book[now]&&root!=now)
{
ans.pb(Ans(now,root,now));
res+=(mx--);
}
for(int i=head[now];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==fa)
continue;
if((flag&&book[now])||(!flag))
{
dfsans(v,now,flag,root);
}
}
if((!book[now])&&(!flag))
{
ans.pb(Ans(now,id[now],now));
res+=d[now];
}
}
void solve()
{
init();
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
}
mx=0;dfsroot(1,-1,0,rt1);
mx=0;dfsroot(rt1,-1,0,rt2);
dfspath(rt1,-1,rt2);
dfsdis(rt1,-1,0,rt1);
dfsdis(rt2,-1,0,rt2);
dfsans(rt1,-1,false,rt2);
dfsans(rt1,-1,true,rt2);
printf("%lld\n",res);
for(auto i:ans)
{
printf("%d %d %d\n",i.a,i.b,i.c);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n))
{
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: