我判新图联通性(题解说是判断联通性)的时候会漏判无解
它这个特判真的在判联通性吗,不应该是在判是否所有边都加进去了吗
如果是加边的话为啥会有可能不全加进去,我完全不懂阿/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
*/