CF1361D Johnny and James(模拟)

因为我要目标值和真实值相同,所以肯定要按目标值大小排序,从小往大排,否则直接就冲突了

之后对于每个节点维护一格mx表示当前周围被填了的mex值,之后对比可以知道是否成功

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
int h[N],ne[N],e[N],idx;
int mx[N];
int ans[N];
struct node{
    int k,w;
}s[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool cmp(node a,node b){
    return a.w<b.w;
}
int main(){
    int n,m;
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    int i;
    for(i=1;i<=n;i++){
        scanf("%d",&s[i].w);
        s[i].k=i;
    }
    sort(s+1,s+1+n,cmp);
    int sign=0;
    for(i=1;i<=n;i++){
        int x=s[i].k;
        int tmp=mx[x];
        if(tmp!=s[i].w-1){
            cout<<-1<<endl;
            sign=1;
            break;
        }
        ans[i]=x;
        for(int j=h[x];j!=-1;j=ne[j]){
            int k=e[j];
            if(mx[k]==s[i].w-1)
                mx[k]=s[i].w;
        }
    }
    if(!sign){
        for(i=1;i<=n;i++){
            printf("%d ",ans[i]);
        }
        cout<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/13235937.html