萌新刚学 OI,对于这道水题有一个小问题 qwq
查看原帖
萌新刚学 OI,对于这道水题有一个小问题 qwq
298549
SIXIANG32楼主2023/3/18 14:01

如题,如果我写的是

//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,谢谢!

2023/3/18 14:01
加载中...