题意:
给定n个点,m条边。每个点都有一个权值ai。
问你如何遍历图,使得当前节点为u,与u相连的节点集合{v1,v2,v3,v4,v5…}
求出mex{v1,v2,v3,v4…v5} 为 x 判断 a[u]是否等于x 。
如果存在序列输出,如果不存在输出-1
解析:
肯定是贪心的从小到大遍历。所以我们只要把ai排好序。
当轮到i节点时,判断与i节点相邻的数的mex是否等于a[i] 如果不等于直接输出-1 即可 。剩下的模拟即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int b[N];
vector<int> G[N];
set<int> s;
int n,m;
struct node
{
int x,pos;
}a[N];
bool cmp(const node &a,const node &b)
{
return a.x<b.x;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1,u,v;i<=m;i++)
{
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
b[i]=a[i].x;
a[i].pos=i;
}
sort(a+1,a+1+n,cmp);
vector<int> v;
for(int i=1;i<=n;i++)
{
int u=a[i].pos;
set<int> s;
for(auto x:G[u]){
if(x == u) continue;
if(b[x]==b[u])
{
// cout<<i<<"*****"<<endl;
puts("-1");
return 0;
}
s.insert(b[x]);
}
// cout<<"**********"<<endl;
for(int j=1;j<b[u];j++){
if(s.find(j)==s.end()){
// cout<<i<<" "<<j<<"*****"<<endl;
puts("-1");
return 0;
}
}
v.push_back(u);
}
for(auto x:v){
cout<<x<<" ";
}
cout<<endl;
}