【悬关】MnZn 求调菊花图部分
查看原帖
【悬关】MnZn 求调菊花图部分
913998
viridis楼主2023/11/26 09:48
// #include <iostream>
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
const int N = 2005;

struct edge{
    int to,ne;
}e[N<<2];
int k,pre[N];

int ma,c[N]; // ma 最大度数 c_i i 号点度数
int n,w[N];
int f[N]; // 并查集
int ans[N]; // 存答案

inline void add(int u,int v){
    e[++k] = {v,pre[u]};
    pre[u] = k;
}

inline int find(int x){
    if(f[x] == x) return x;
    return f[x] = find(f[x]);
}

inline void merge(int x,int y){
    int fx = find(x);
    int fy = find(y);
    if(fx != fy) f[fx] = fy;
}

inline void dfs(){
    
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(NULL);
    
    int T;
    cin >> T;
    while(T--){
        memset(e,0,sizeof(e));
        
        cin >> n;
        for(int i = 1; i <= n; i++){
            cin >> w[i];
        }
        
        int x,y;
        for(int i = 1; i < n; i++){
            cin >> x >> y;
            add(x,y); add(y,x);
            c[x]++,c[y]++;
            ma = max({ma,c[x],c[y]});
        }
        
        if(ma == n-1){ // 菊花图
            set<int > s;
            for(int i = 1; i <= n; i++){ // 初始化
                f[i] = i;
                s.insert(i);
            }
            
            for(int i = 1; i <= n; i++){
                int num = w[i];
                for(auto it : s){
                    if(i == n || find(num) != find(it)){
                        ans[i] = it;
                        merge(num,it);
                        s.erase(it);
                        break;
                    }
                }
            }
            
            for(int i = 1; i <= n; i++)
                cout << ans[i] << " ";
            cout << endl;
            continue;
        }
        
        if(ma == 1){ // 链图
            
            continue;
        }
        
        if(n <= 10){ // 暴力
            
            continue;
        }
    }
    
	return 0;
}
2023/11/26 09:48
加载中...