1358. Cables

http://acm.timus.ru/problem.aspx?space=1&num=1358

画一个方格阵  按一定次序 依次放节点就可以了

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;



const int N=1005;

const int INF=0x3f3f3f3f;

//typedef pair<int,int>point;

int X[N],Y[N];

struct node

{

    int j,next;

}side[N*2];

int head[N],I;

bool visited[N];

void add(int i,int j)

{

    side[I].j=j;

    side[I].next=head[i];

    head[i]=I++;

}

void init(int n)

{

    memset(head,-1,sizeof(head));

    I=0;

    for(int i=1;i<n;++i)

    {

        int l,r;

        scanf("%d %d",&l,&r);

        add(l,r);

        add(r,l);

    }

}

void solve(int n)

{

    memset(visited,false,sizeof(visited));

    queue<int>qt;

    vector<int>vt;

    qt.push(1);

    visited[1]=true;

    X[1]=1;

    Y[1]=1;

    int l=1;

    while(true)

    {

        vt.clear();

        while(!qt.empty())

        {

            int x=qt.front();qt.pop();

            for(int t=head[x];t!=-1;t=side[t].next)

            {

                int j=side[t].j;

                if(!visited[j])

                {

                    visited[j]=true;

                    vt.push_back(j);

                }

            }

        }

        if(vt.size()==0)

        break;

        l=l+2;

        while(true)

        {

            int tmp=(l>n)?(n+n-l):l;

            if(tmp>=vt.size())

            break;

            ++l;

        }

        int x,y;

        if(l<=n)

        {x=l;y=1;}

        else

        {x=n;y=l-n+1;}

        for(unsigned int i=0;i<vt.size();++i)

        {

            X[vt[i]]=x;

            Y[vt[i]]=y;

            qt.push(vt[i]);

            --x;++y;

        }

    }

}

int main()

{

    //freopen("data.in","r",stdin);

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        init(n);

        solve(n);

        for(int i=1;i<=n;++i)

        printf("%d %d\n",X[i],Y[i]);

    }

}

  

 

你可能感兴趣的:(ab)