• https://www.luogu.com.cn/problem/CF691D


    Aimee

    显然可以证得,如果把所有可以交换的点之间连边,那么他们构成了联通块,对于每一个联通块,你可以让他们成为你想要的任何顺序

    那就是找联通块,块内依次排序即可

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int n,m;
    int a[1000001];
    struct e{
    	int to;
    	int ne;
    }ed[5000001];
    int head[1000001];
    int p;
    int vis[1000001];
    int znx[1000001];
    priority_queue <int> qv;
    priority_queue <int> qid; 
    void add(int f,int to){
    	p++;
    	ed[p].ne=head[f];
    	ed[p].to=to;
    	head[f]=p;
    } 
    int x,y;
    void dfs(int now){
    	if(vis[now])
    	return ;
    	vis[now]=1;
    	qv.push(a[now]);
    	qid.push(-now);
    	for(int i=head[now];i;i=ed[i].ne){
    		dfs(ed[i].to);
    	}
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	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){
    		if(!vis[i]){
    			dfs(i);
    		}
    		while(!qid.empty()){
    			znx[-qid.top()]=qv.top();
    			qid.pop();qv.pop();
    		}
    	}
    	for(int i=1;i<=n;++i){
    		cout<<znx[i]<<" ";
    	}
    	return 0;
    }
    
  • 相关阅读:
    编程之美-2.18 数组分割
    话题模型
    暂时跳过的Leetcode题目
    LDA主题模型
    二叉树非递归的统一实现
    取余和取模运算
    IDM非补丁破解方法
    两种建立堆的方法HeapInsert & Heapify
    非阻塞connect:Web客户程序
    非阻塞connect
  • 原文地址:https://www.cnblogs.com/For-Miku/p/14829548.html
Copyright © 2020-2023  润新知