如题,如果我写的是
//SIXIANG
#include <iostream>
#include <vector>
#include <cstring>
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
vector <int> gra[MAXN + 10];
int cl[MAXN + 10], n, m, deg[MAXN + 10], k;
bool vis[MAXN + 10], qwq[MAXN + 10];
void dfs(int u) {
vis[u] = 1;
for(int p = 0; p < gra[u].size(); p++) {
int v = gra[u][p];
if(!vis[v])
dfs(v);
}
for(int p = 0; p < gra[u].size(); p++)
qwq[cl[gra[u][p]]] = 1;
for(int p = 1; p <= k; p++) {
if(!qwq[p]) {
cl[u] = p;
break;
}
}
for(int p = 0; p < gra[u].size(); p++)
qwq[cl[gra[u][p]]] = 0;
}
void init() {
memset(deg, 0, sizeof(deg));
memset(cl, 0, sizeof(cl));
memset(vis, 0, sizeof(vis));
k = 0;
for(int p = 1; p <= n; p++)
gra[p].clear();
for(int p = 1, x, y; p <= m; p++) {
cin >> x >> y;
gra[x].push_back(y);
gra[y].push_back(x);
deg[x]++, deg[y]++;
}
for(int p = 1; p <= n; p++)
k = max(k, deg[p]);
if(!(k & 1)) k++;
cout << k << endl;
dfs(1);
for(int p = 1; p <= n; p++)
cout << cl[p] << endl;
cout << endl;
}
int main() {
while(cin >> n >> m) {
init();
}
}
我就寄了,但是如果把 dfs 改成
void dfs(int u) {
vis[u] = 1;
for(int p = 0; p < gra[u].size(); p++)
qwq[cl[gra[u][p]]] = 1;
for(int p = 1; p <= k; p++) {
if(!qwq[p]) {
cl[u] = p;
break;
}
}
for(int p = 0; p < gra[u].size(); p++)
qwq[cl[gra[u][p]]] = 0;
for(int p = 0; p < gra[u].size(); p++) {
int v = gra[u][p];
if(!vis[v])
dfs(v);
}
}
一个是先遍历后填,一个是先填后遍历,不知道为什么第一种写法会寄,如果有可能的话请巨佬给个 hack,谢谢!