Codeforces Round #766 (Div. 2)
(solved A B)
比赛链接 https://codeforces.com/contest/1627
C题
emm…犯了些愚蠢到离谱的错误: 臆想了给各边赋的值要互不相等,忘了这是一棵树 不会是森林。
题目大意
给出一棵树,需要你为各边赋值,要求各值必须为质数且相连接的两边的权值和也是质数
题解
只有2这一个质数才有可能加上一个别的质数和也是质数,也正因为前一条,每个顶点最多有两条边。这么一来这棵树只能是一条链
#include <bits/stdc++.h>
//#define int long long
using namespace std;
vector<int> a[100005];
int vis[100005];
int res[100005];
map<pair<int,int>,int> idx;
void solve();
void dfs(int pre,int x,int val);
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int t;cin>>t;
while(t--)solve();
#define _ 0
return ~~(0^_^0);
}
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++){
a[i].clear();
vis[i]=0;
}
idx.clear();
for(int i=0;i<n-1;i++){
int u,v;
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
idx[{u,v}]=idx[{v,u}]=i;
}
for(int i=1;i<=n;i++){
if(a[i].size()>2){
cout<<"-1\n";
return ;
}
}
int zz;
for(int i=1;i<=n;i++){
if(a[i].size()==1){
zz=i;
break;
}
}
dfs(0,zz,0);
for(int i=0;i<n-1;i++){
cout<<res[i]+2<<' ';
}
cout<<'\n';
}
void dfs(int pre,int x,int val){
// cout<<"x:"<<x<<'\n';
vis[x]=1;
for(int i:a[x]){
if(!vis[i] && i!=pre){
res[idx[{i,x}]]=val;
// cout<<"idx:"<<idx[{i,x}]<<'\n';
dfs(x,i,val^1);
}
}
}