• 6.6每日一题题解


    D. Johnny and Contribution

    涉及知识点:

    • 搜索/图论

    solution:

    • 首先大体说一下题意
    • 一开始是一个图的边,然后最后输入的是每个节点他们的优先级
    • 这里的优先级就是标记为多少,不能2个优先级相同的相邻,也不能跳着整优先级,比如 1 3相邻,然后就输出谁先排序即可。
    • 然后就说下怎么做吧
    • 首先存入点的优先级,和他的编号:
    for (int i = 1; i <= n; i++){
    		scanf("%d",&ans[i].ord);
    		ans[i].id = i;
    	}
    
    • 然后排序:(优先级小的肯定先输出)
    sort(ans + 1,ans + 1 + n,cmp);
    
    • 然后我们进行循环bfs,首先我们知道一个道理,就是如果我们当前点的优先级为1,那么他的边上的点的优先级为2(都++)
    • 然后判断当前点的优先级是否符合已标记的优先级:
    if (w[t] == k){
    	bfs(t,k);
    }
    
    • 如果符合就进行bfs,然后我们对周围的点是当前优先级的++,因为肯定要++的,为了判断下个优先级是否符合条件,这个地方自己想一下,画下图
    • 然后最后输出即可,就是排序的顺序

    std:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    const int N = 500010, M = 1000010;
    
    int h[N], ne[M], e[M], w[M], idx ;
    int cnt = 0;
    int d[M]; // 记录出场循序
    
    struct node{
    	int id;
    	int ord;
    }ans[M];
    
    bool cmp(node aa, node bb){
    	if (aa.ord == bb.ord) return aa.id < bb.id;
    	return aa.ord < bb.ord;
    }
    
    void add(int x, int y){
    	e[idx] = y, ne[idx] = h[x], h[x] = idx++;
    }
    
    void bfs(int x, int y){
    	for (int i = h[x]; i != -1; i = ne[i]){
    		int j = e[i];
    		if (w[j] == y) w[j] ++;
    	}
    }
    
    int main(){
    	memset(h,-1,sizeof h);
    	int n, m;
    	scanf("%d%d",&n,&m);
    	int x, y;
    	for (int i = 1; i <= m ; i++){
    		scanf("%d%d",&x,&y);
    		add(x,y), add(y,x);
    	}
    	for (int i = 1; i <= n; i++){
    		scanf("%d",&ans[i].ord);
    		ans[i].id = i;
    	}
    	int f = 1;
    	sort(ans + 1, ans + 1 + n, cmp);
    	for (int i = 1; i <= n; i++) w[i] = 1;
    	for (int i = 1; i <= n; i ++){
    		int t = ans[i].id;
    		int k = ans[i].ord;
    		d[i] = t;
    		if (w[t] == k){
    			bfs(t,k);
    		}
    		else{
    			f = 0;
    			break;
    		}
    	}
    	if (f){
    		for (int i = 1; i <= n; i++){
    			printf("%d ",d[i]);
    		}
    		puts("");
    	}
    	else{
    		puts("-1");
    	}
        return 0;
    }
    

    转载于 博客地址

  • 相关阅读:
    C#:将子Form加入父Form中
    C#:简单线程样例
    C#:实现接口中定义的事件
    easyui设置界面的高度自适应
    JQuery
    vim常用命令(iOS)
    Linux的IO性能监控工具iostat详解
    php多线程抓取信息测试例子
    使用Gitosis搭建Git服务器
    CentOS 6.4 搭建git 服务器
  • 原文地址:https://www.cnblogs.com/QFNU-ACM/p/13054886.html
Copyright © 2020-2023  润新知