题目描述:
输入描述:
输出描述:
样例和解释:
题意:给定n个点和n - 1条边,你可以给每条边一个权值,让长度为1或者为2的路径的权值和为质数
思路:如果一个点和至少三个点相连的时候,长度为2的路径的权值一定会出现合数,如果没有的话就可以用2, 3交替构造
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
int a[100005];
int b[100005];
int in[100005];
bool vis[100005];
vector<int> ve[100005];
map<pair<int, int>, int> mp;
void dfs(int u, int w){
for(int i = 0; i < ve[u].size(); i++){
if(vis[ve[u][i]] == 0){
vis[ve[u][i]] = 1;
mp[{u, ve[u][i]}] = w;
mp[{ve[u][i], u}] = w;
dfs(ve[u][i], w ^ 1);
}
}
}
int main(){
ios::sync_with_stdio(false);
int t;
cin >> t;
while(t--){
int n;
cin >> n;
mp.clear();
for(int i = 1; i <= n; i++){
in[i] = 0;
vis[i] = 0;
ve[i].clear();
}
for(int i = 1; i < n; i++){
cin >> a[i] >> b[i];
ve[a[i]].push_back(b[i]);
ve[b[i]].push_back(a[i]);
in[a[i]]++;
in[b[i]]++;
}
int x = 0;
bool f = 0;
for(int i = 1; i <= n; i++){
if(in[i] == 1){
x = i;
}if(in[i] >= 3){
f = 1;
}
}
if(f){
cout << -1 << endl;
}else{
vis[x] = 1;
dfs(x, 2);
for(int i = 1; i < n; i++){
if(i != 1){
cout << " ";
}
cout << mp[{a[i], b[i]}];
}
cout << endl;
}
}
return 0;
}