为什么会漏判无解
查看原帖
为什么会漏判无解
106738
_Felix楼主2022/11/15 15:01

我判新图联通性(题解说是判断联通性)的时候会漏判无解

它这个特判真的在判联通性吗,不应该是在判是否所有边都加进去了吗

如果是加边的话为啥会有可能不全加进去,我完全不懂阿/px

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define fi first
#define se second
#define mkp make_pair
#define PII pair<int,int>
const int N = 1e6 + 5;
PII ed[N]; int lst;
int n, m, in[N], nxt[N], pre[N]; 
int e, to[N], nx[N], hd[N], val[N], qwq;
int top, st[N];
bool vis[N];
vector<int>ans;
map<int, int>mp[N];
void add(int u, int v, int w) {
	to[++e] = v; val[e] = w; 
	nx[e] = hd[u]; hd[u] = e;
	in[v]++; in[u]--;
}
void solve(int u, int ed) {
	for(int i = hd[u]; i; i = hd[u]) {
		qwq++; hd[u] = nx[i];
		int v = to[i];
		solve(v, val[i]);
	}
	if(ed) st[++top] = ed;
	return;
}
bool check() {
	int ret = 0;
	for(int i = 1; i <= m; i++) 
		if(!pre[i]) {
			lst = i;
			int j = i;
			while(j){
				if(vis[j]) return 0; vis[j] = 1;
				lst = j; ret++;
				j = nxt[j]; 
			}
			add(ed[i].fi, ed[lst].se, i);
		}
	return ret == m; //题解的特判 方式
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1, a, b; i <= m; i++)
		scanf("%d%d", &a, &b), ed[i].fi = a, ed[i].se = b, mp[a][b] = i, in[b]++, in[a]--;
	for(int i = 1; i <= n; i++)
		if(in[i]) return puts("NIE"), 0;
	int t; scanf("%d", &t);
	for(int i = 1; i <= t; i++) {
		int k; scanf("%d", &k);
		int nw, pr;
		vector<int>vec; vec.clear();
		for(int j = 1; j <= k; j++) {
			pr = nw;
			scanf("%d", &nw);
			if(j > 1) {
				if(mp[pr].find(nw) == mp[pr].end())
					return puts("NIE"), 0;
				vec.push_back(mp[pr][nw]);
			}
		}
		for(int j = 1; j < vec.size(); j++) {
			if(nxt[vec[j - 1]] && nxt[vec[j - 1]] != vec[j]) return puts("NIE"), 0;
			nxt[vec[j - 1]] = vec[j];
			if(pre[vec[j]] && pre[vec[j]] != vec[j - 1]) return puts("NIE"), 0;
			pre[vec[j]] = vec[j - 1];
		}
	}
	
	if(!check() || !hd[1]) return puts("NIE"), 0;
	
	for(int i = 1; i <= n; i++)
		if(in[i]) return puts("NIE"), 0;
	solve(1, 0);
	if(qwq == e) { //我的特判 方式
		puts("TAK");
		while(top) { ans.push_back(st[top]); top--; }
		puts("1");
		for(int i = 0; i < ans.size(); i++) {
			for(int j = ans[i]; j; j = nxt[j])
				printf("%d\n", ed[j].se);
		} 
	} else puts("NIE");
	return 0;
}
/*
1 3
4 1
3 4
1 2
2 1
*/

2022/11/15 15:01
加载中...