CodeForces

来源:互联网 发布:编程电脑配置 编辑:程序博客网 时间:2024/06/16 10:59

http://codeforces.com/problemset/problem/691/D




给出1到n的自然数列,再给出若干位置对,表示可以将2个位置的数互换,求最终数列字典序最大,思路就是,从小到开始去搜,例如14 47,则可以将1和7换位置,可以用并查集来实现,将小的尽量放后面,大的尽量放前面。



#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;int a[1111111];int p[1111111];priority_queue<int>q[1111111];int find(int x){if(x==p[x])  return p[x]; return p[x]=find(p[x]);}void unin(int x,int y){int m=find(x);int n=find(y);if(m!=n){p[m]=n;}}int main(){int m,n;while(scanf("%d%d",&m,&n)!=EOF){int i;for(i=1;i<=m;i++){scanf("%d",&a[i]);p[i]=i;}for(i=0;i<n;i++){int x,y;scanf("%d%d",&x,&y);unin(x,y);}for(i=1;i<=m;i++){q[p[find(i)]].push(a[i]);}for(i=1;i<=m;i++){if(i==m){printf("%d\n",q[p[i]].top());}else printf("%d ",q[p[i]].top());q[p[i]].pop();}}return 0;}