• Codeforces Round #496 (Div. 3) F


    F - Berland and the Shortest Paths

    思路:还是很好想的,处理出来最短路径图,然后搜k个就好啦。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define pii pair<int, int>
    
    using namespace std;
    
    const int N = 5e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 998244353;
    
    int n, m, k, tot, d[N], head[N], ans[N];
    LL cnt;
    struct node {
        int u, v, nx;
    } edge[N];
    
    void add(int u, int v) {
        edge[tot].u = u;
        edge[tot].v = v;
        edge[tot].nx = head[u];
        head[u] = tot++;
    }
    
    vector<int> vec[N];
    
    void bfs() {
        queue<int> que;
        d[1] = 0;
        que.push(1);
    
        while(!que.empty()) {
            int u = que.front(); que.pop();
            for(int i = head[u]; ~i; i = edge[i].nx) {
                int v = edge[i].v;
                if(d[v] != -1) continue;
                d[v] = d[u] + 1;
                que.push(v);
            }
        }
    }
    
    void dfs(int pos) {
        if(cnt <= 0) return;
        if(pos == n + 1) {
            cnt--;
            for(int i = 1; i <= m; i++)
                printf("%d", ans[i]);
            puts("");
            return;
        }
        for(int i = 0; i < vec[pos].size(); i++) {
            ans[vec[pos][i]] = 1;
            dfs(pos + 1);
            ans[vec[pos][i]] = 0;
        }
    }
    int main(){
        memset(head, -1, sizeof(head));
        scanf("%d%d%d", &n, &m, &k);
        for(int i = 1; i <= m; i++) {
            int u, v; scanf("%d%d", &u, &v);
            add(u, v);
            add(v, u);
        }
    
        memset(d, -1, sizeof(d));
    
        bfs();
        for(int i = 0; i < tot; i++) {
            int u = edge[i].u, v = edge[i].v;
            if(d[u] + 1 == d[v]) {
                vec[v].push_back(i / 2 + 1);
            }
        }
    
    
        cnt = 1;
        for(int i = 2; i <= n; i++) {
            cnt *= (int) vec[i].size();
            if(cnt >= k) break;
        }
    
        cnt = min(cnt, 1ll * k);
        printf("%lld
    ", cnt);
        dfs(2);
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    Codeforces Round #501 (Div. 3)
    01分数规划
    矩阵快速幂模板
    求区间不同数的个数 树状数组||莫队算法
    vector
    线性dp
    别人整理的dp题目
    codeforces1073d Berland Fair 思维(暴力删除)
    codeforces 1072D Minimum path bfs+剪枝 好题
    codeforces 1068d Array Without Local Maximums dp
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9287642.html
Copyright © 2020-2023  润新知