WA代码及其原因
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <cstdio>
#include <string.h>
#include <vector>
#include <cmath>
#include <map>
#include <cstdlib>
using namespace std;
#define INFTY (1 << 30)
#define RG register int
#define ll long long
#define MAX 20000 + 5
#define REP(i, a, b) for (register int i = (a); i < (b); i++)
int n, m, son[MAX], id[MAX], p[MAX], maxn = 0, dfn[MAX];
vector<int> G[MAX];
int Index = 0;
void dfs(int u, int from) //令刚开始的from的值为0
{
dfn[u] = 1;
for (int i = 0; i < G[from].size(); i++)//因为顺序的问题,这可能导致一些本应该被加的点错过
{
if (dfn[u] == dfn[from])
dfn[u]++;
if ((!dfn[G[from][i]])||G[from][i]==u) //说明这个点还没有被遍历过,亦或者自己连了自己
continue;
else
{
if (dfn[u] == dfn[G[from][i]]) //如果自己等于自己咋办
dfn[u]++;
}
//现在最大的问题是如何把这两个东西合在一起呢
/*for(int i=1;;i++){if(!dfn[i])
dfn[u]=i;
break;}*/
}
maxn = max(maxn, dfn[u]);
//<<u<<" "<<G[u].size();
for (int i = 0; i < G[u].size(); i++)
{ if(G[u][i]==from)
continue;
dfs(G[u][i], u);
}
return;
}
void addtree(int u, int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
void init()
{
maxn = 0;
for (int i = 0; i < MAX; i++)
G[i].clear();
memset(dfn, 0, sizeof(dfn));
}
int main()
{
int T;
int a, b;
scanf("%d", &n);
init();
for (int i = 0; i < n - 1; i++)
{
scanf("%d%d", &a, &b);
addtree(a, b);
}
dfs(1, 0);
int k = 0;
printf("%d\n", maxn);
for (int i = 1; i <= n; i++)
{
if (i != 1)
printf(" ");
printf("%d", dfn[i]);
}
//system("pause");
return 0;
}
这里面的最大问题就是,我如果遍历一个简单的树1 ->3-> 2,可能前面生成了 颜色 2 1,但是我在遍历的时候,因为初始为1,与结点3要求颜色不一样就可以,那么我只要加一个2就行,这导致错误
解决方案:以这个向上寻找的涂色来看,我们要知道遍历的顺序对题目的影响,已经知道兄弟之间无法相同,那么兄弟与兄弟之间的颜色一定要加1,如果初始点的颜色与父、曾父一样,先加1
这样考虑的话,还是以u为结点考虑比较靠谱
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <cstdio>
#include <string.h>
#include <vector>
#include <cmath>
#include <map>
#include <cstdlib>
using namespace std;
#define INFTY (1 << 30)
#define RG register int
#define ll long long
#define MAX 200000 + 5
#define REP(i, a, b) for (register int i = (a); i < (b); i++)
int n, m, son[MAX], id[MAX], p[MAX], maxn = 0, dfn[MAX];
vector<int> G[MAX];
int Index = 0;
void dfs(int u, int from) //令刚开始的from的值为0
{
int cnt = 1;
for (int i = 0; i < G[u].size(); i++)
{
if (G[u][i] == from)
continue;
while (cnt == dfn[u] || cnt == dfn[from])
cnt++;
dfn[G[u][i]] = cnt++;
maxn = max(maxn, dfn[G[u][i]]);
}
//<<u<<" "<<G[u].size();
for (int i = 0; i < G[u].size(); i++)
{
if (G[u][i] == from)
continue;
dfs(G[u][i], u);
}
return;
}
void addtree(int u, int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
void init()
{
maxn = 0;
for (int i = 0; i < MAX; i++)
G[i].clear();
memset(dfn, 0, sizeof(dfn));
dfn[1]=1;
}
int main()
{
int T;
int a, b;
scanf("%d", &n);
init();
for (int i = 0; i < n - 1; i++)
{
scanf("%d%d", &a, &b);
addtree(a, b);
}
dfs(1, 0);
int k = 0;
printf("%d\n", maxn);
for (int i = 1; i <= n; i++)
{
if (i != 1)
printf(" ");
printf("%d", dfn[i]);
}
printf("\n");
//system("pause");
return 0;
}
努力伐树的小木匠~~~~~~~~~~