您的位置:首页 > 其它

Codeforces Round #394 (Div. 2)-E. Dasha and Puzzle(dfs)

2017-02-03 15:52 507 查看
记录一个菜逼的成长。。

题目链接

PS:看了半天题意没看懂。。

题目大意:

给你N个点的树,问能否将这些点放在坐标平面上,要求边平行于坐标轴。

首先一个点的度数不超过4。因为平面只有四个方向,若度数超过4,肯定不存在方案。

然后就以2^n为长度递减dfs放点。

∑ni=12i<2n+1

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long LL;
const int maxn = 1000 + 10;
int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
int dui[10]={2,3,0,1};//来时的方向,假设这个点不是初始点,并且要往0方向走,那么上一个点相对于这个点在这个点的2方向
int d[maxn];
LL ans[maxn][2];
int n;
vector<int>edge[maxn];
void dfs(int now,int from,LL x,LL y,LL len,int fromdir)
{
int dir = 0;
ans[now][0] = x;
ans[now][1] = y;
for( int i = 0; i < edge[now].size(); i++ ){
int v = edge[now][i];
if(v == from)continue;
if(fromdir != -1 && dir == dui[fromdir])dir++;
dfs(v,now,x+dx[dir]*len,y+dy[dir]*len,len>>1,dir);
dir++;
}
}
int main()
{
while(~scanf("%d",&n)){
for( int i = 0; i < n-1; i++ ){
int u,v;
scanf("%d%d",&u,&v);
edge[u].pb(v);
edge[v].pb(u);
d[u]++;
d[v]++;
}
for( int i = 1; i <= n; i++ )if(d[i] > 4){puts("NO");return 0;}
dfs(1,-1,0,0,1LL<<58,-1);
puts("YES");
for( int i = 1; i <= n; i++ ){
printf("%I64d %I64d\n",ans[i][0],ans[i][1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces dfs