首页 > 代码库 > bzoj3918 [Baltic2014]Postman

bzoj3918 [Baltic2014]Postman

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3918

【题解】

每日至少更一题啊qwq凑任务(迷

明显猜个结论:随便搜环就行了

然后搜环姿势错了我也很无奈啊。。。

技术分享
# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 1500000 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n, m;
int head[M], nxt[M], to[M], tot = 1;
inline void add(int u, int v) {
    ++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v; 
}
inline void adde(int u, int v) {
    add(u, v);
    add(v, u);
}

bool vis[M]; 
int Final;
int c[M], cn, p[M];
 
inline void dfs(int x) {
    if(p[x] != -1) {
        printf("%d", x);
        for (int i=p[x]+1; i<=cn; ++i) {
            printf(" %d", c[i]);
            p[c[i]] = -1;
        }
        puts(""); 
        cn = p[x];
        return;
    }
    c[++cn] = x;
    p[x] = cn;
    for (int i=head[x]; i; i=nxt[i]) {
        if(vis[i] || vis[i^1]) continue;
        head[x] = nxt[i];
        vis[i] = 1;
        dfs(to[i]);
        if(p[x] == -1) break;
    }
}


int main() {
    scanf("%d%d", &n, &m);
    for (int i=1; i<=m; ++i) {
        int u, v; scanf("%d%d", &u, &v);
        adde(u, v);
    }
    
    for (int i=1; i<=n; ++i) p[i] = -1;
    
    for (int i=2; i<=tot; i++) 
        if(!vis[i] && !vis[i^1]) 
            dfs(to[i]); 

    return 0;
}
View Code

 

bzoj3918 [Baltic2014]Postman