zoukankan      html  css  js  c++  java
  • CF1361A Johnny and Contribution(拓扑排序)

    题意:

    给出一个图,每个顶点有一个目标权值,请你设计一个访问顺序,使得节点被访问时的权值是目标权值。

    节点当前权值设定为与它相连的所有节点中已被访问的节点的权值之外的最小值。

    题解:

    合法的条件就是,每个节点周围必须有w[i]-1个不同的节点,且最大值要是w[i]。

    然后考试的时候我写了一个类似于拓扑排序的算法,在入队的部分根据题意乱搞了一下。。。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5e5+100;
    int visit[maxn];
    int w[maxn];//每个顶点的目标
    int s[maxn];//每个顶点的初始值,都为1
    queue<int> q;
    vector<int> ans;
    int n,m;
    vector<int> g[maxn];
    set<int> st[maxn];
    void topOrder () {
        for (int i=1;i<=n;i++) if (s[i]==w[i])  {
            q.push(i),visit[i]=1;
            //break;
        }
        while (!q.empty()) {
            int u=q.front();
            q.pop();
            ans.push_back(u);
            for (int i=0;i<g[u].size();i++) {
                int v=g[u][i];
                if (visit[v]) continue;
                if (s[v]<s[u]+1) s[v]=s[u]+1;
                if (s[v]==w[v]) {
                    q.push(v);
                    visit[v]=1;
                }
                
            }
        }
    }
    struct node {
        int u,v;
    };
    vector<node> vi;
    int main () {
        scanf("%d%d",&n,&m);
        for (int i=0;i<m;i++) {
            int x,y;
            scanf("%d%d",&x,&y);
            g[x].push_back(y);
            g[y].push_back(x);
            vi.push_back({x,y});
        }
        for (int i=1;i<=n;i++) scanf("%d",&w[i]),s[i]=1; 
        for (int i=0;i<vi.size();i++) {
            int u=vi[i].u;
            int v=vi[i].v;
            if (w[u]<w[v]) st[v].insert(w[u]);
            if (w[v]<w[u]) st[u].insert(w[v]);
            if (w[vi[i].u]==w[vi[i].v]) {
                printf("-1
    ");
                return 0;
            }
        }
        for (int i=1;i<=n;i++) {
            if (st[i].size()<w[i]-1) {
                printf("-1
    ");
                return 0;
            }
        }
        topOrder();
        if (ans.size()<n) {
            printf("-1
    ");
            return 0;
        }
        for (int i=0;i<ans.size();i++) printf("%d ",ans[i]);
        return 0;
    } 
  • 相关阅读:
    webpack 命令行 传入自定义变量
    PHP 装饰器模式
    php图片合成【png图片】
    Sublime Text 3.1 3170 / 3176 注册码(附降级与禁止更新方法)
    菜鸟教程jsonp基础知识讲解
    CentOS7用yum安装软件提示 cannot find a valid baseurl for repobase7x86_64
    PHP的parse_ini_file()函数,解释结构类型php.ini格式的文件
    scp命令详解
    php常用错误码的意思
    php模式设计之 适配器模式
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13048385.html
Copyright © 2011-2022 走看看