solve 5/11
补题:7/11
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; }