solve 5/11

补题:7/11

A Cactus Draw

Code:zz

Thinking :zz

题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交。

很好想的构造题,因为网格有n*n,足够大,所以结点1放在(1,1)的位置,与结点1相连的结点依次放在(2,1),(2,2)...的位子,依此类推。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<bitset>
#include<unordered_map>
const int maxn = 0x3f3f3f3f;
const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427;
const double PI = 3.141592653589793238462643383279;
using namespace std;
struct s
{
    int a,b;
}z[2020],ans[2020];
vector<int>ve[2020];
int c[2020],hi[2020],d[2020];
int main(void)
{
    int n,m,i,si,j,pos,cnt;
    while(~scanf("%d %d",&n,&m))
    {
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        memset(hi,0,sizeof(hi));
        for(i = 0;i <= n;i++)
        {
            ve[i].clear();
        }
        for(i = 0;i < m;i++)
        {
            scanf("%d %d",&z[i].a,&z[i].b);
            ve[z[i].a].push_back(z[i].b);
            ve[z[i].b].push_back(z[i].a);
        }
        /*for(i = 1;i <= n;i++)
        {
            printf("%d: ",i);
            for(j = 0;j < ve[i].size();j++)
            {
                printf("%d ",ve[i][j]);
            }
            printf("\n");
        }*/
        queue<int>q;
        q.push(1);
        cnt = 0;
        c[1] = 1;
        d[1] = 1;
        hi[1] = 1;
        while(!q.empty())
        {
            pos = q.front();
            
            q.pop();
            //c[pos] = cnt++;
            //printf("%d %d\n",c[pos],d[pos]);
            ans[pos].a = c[pos];
            ans[pos].b = d[pos];
            si = ve[pos].size();
            //printf("pos = %d : ",pos);
            for(j = 0;j < si;j++)
            {
                //printf("   %d ",ve[pos][j]);
                if(!c[ve[pos][j]])
                {
                    c[ve[pos][j]] = c[pos] + 1;
                    d[ve[pos][j]] = hi[c[ve[pos][j]]] + 1;
                    hi[c[ve[pos][j]]]++;
                    q.push(ve[pos][j]);
                }
            }
            //printf("\n");
        }
        for(i = 1;i <= n;i++)
        {
            printf("%d %d\n",ans[i].a,ans[i].b);
        }
    }
    return 0;
}
View Code

相关文章: