求助,assert不出来
查看原帖
求助,assert不出来
682934
yllcm楼主2022/10/13 11:41

快要自闭了,SPJ 说我的路径不是简单环,但是我加了一堆 assert 还是检查不出来

/*10:24*/
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define FR first
#define SE second
using namespace std;
inline int read() {
    int x = 0; bool op = 0;
    char c = getchar();
    while(!isdigit(c))op |= (c == '-'), c = getchar();
    while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return op ? -x : x;
}
const int N = 1e6 + 10;
int n, m, top, cnt;
int deg[N], stk[N], r[N], tg[N], hd[N], p[N], cr[N];
int vis[N];
vector<pii> G[N];
vector<vector<int> > ans;
void dfs(int u) {
    tg[u] = true;
    for(int i = hd[u]; i < G[u].size(); i = hd[u]) {
        pii e = G[u][i]; hd[u] = i + 1;
        if(cr[e.FR])continue; cr[e.FR] = true;
        dfs(e.SE);
    }
    p[++cnt] = u;
    return ;
}
void solve(int st) {
    cnt = 0; top = 0; dfs(st);
    for(int i = cnt; i; i--) {
        stk[++top] = p[i]; 
        if(r[p[i]]) {
            vector<int> v;
            int st = r[p[i]];
            for(int j = st; j <= top; j++) {
                v.pb(stk[j]); r[stk[j]] = 0;
            }
            ans.pb(v); top = st;
        }
        r[p[i]] = top;
    }
    return ;
}
map<pii, int> f;
int main() { 
    freopen("4.in", "r", stdin);
    freopen("out.txt", "w", stdout);
    n = read(); m = read();
    for(int i = 1; i <= m; i++) {
        int u = read(), v = read(), s = read(), t = read();
        if(s ^ t) {
            G[u].pb(mp(i, v)); G[v].pb(mp(i, u));
            deg[u]++; deg[v]++;
            f[mp(u, v)] = f[mp(v, u)] = true;
        }
    }
    for(int i = 1; i <= n; i++)if(deg[i] & 1)return puts("NIE"), 0;
    for(int i = 1; i <= n; i++)if(tg[i] == false)solve(i);
    printf("%d\n", ans.size());
    for(auto v : ans) {
        printf("%d ", v.size());
        for(int x : v)printf("%d ", x); putchar('\n');
        for(int i = 0; i + 1 < v.size(); i++) {
            assert(f[mp(v[i], v[i + 1])] == true);
            assert(vis[v[i]] == false); vis[v[i]] = true;
        }
        assert(v.front() == v.back());
        for(int x : v)vis[x] = false;
        // for(int x : v)assert(vis[x] == false), vis[x] = true;
    }
    return 0;
}
2022/10/13 11:41
加载中...