#include <stdio.h>
const int N=200050, M=1e6;
int n, m, i, j, k, a, b, c, h[N], v[N];
struct AB{
    int a, b, n;
} d[N*2];
void cun(int a, int b){
    d[++k].a = a, d[k].b = b;
    d[k].n = h[a], h[a] = k;
}
void dfs(int a){
    int b, i;
    if(++c >= M) return;
    v[a] = 1;
    for(i=h[a]; i; i=d[i].n){
        b = d[i].b;
        if(!v[b]) dfs(b);
    }
    v[a] = 0;
}//爆搜所有路径,因为限定M次,所以不超时 
int main(){
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &a, &b);
        cun(a, b);
        cun(b, a);
    }
    dfs(1);
    printf("%d\n", c>M?M:c);
    return 0;
}

因为每个点不超过10条边,所以可以开二维数组存储。

#include <bits/stdc++.h>
const int N=200005, M=1e6;
using namespace std;
int n, m, i, j, k, a, b, ans;
int s[N][15], c[N], v[N];
void dfs(int a){
    if(v[a]) return;
    if(ans >= M) return;
    v[a] = 1, ans++;
    for(int i=1; i<=c[a]; i++){
        dfs(s[a][i]);
    }//循环次数不超过10 
    v[a] = 0;
}
int main(){
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &a, &b);
        s[a][++c[a]] = b;
        s[b][++c[b]] = a;
    }//每个点至多10条边 
    dfs(1);
    printf("%d\n", ans>M?M:ans);
    return 0;
}

作者 crxis

发表回复