记录编号 167242 评测结果 AAAAAAAAAA
题目名称 [NOI 2010]航空管制 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.133 s
提交时间 2015-06-22 18:51:28 内存使用 0.76 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

#define N 4010

using namespace std;

int n,m,totE,tot;
int a[N],nt[N],ind[N],pre[N],g[N],topn[N],b[N],pos[N];
int cntd[N];
bool v[N],rem[N];
queue<int> q;

struct edge{
	int x,to;
}E[N*10];

void ade(int x,int y){
	E[++totE]=(edge){y,g[x]}; g[x]=totE; ind[y]++;
}

bool cmp(int x,int y){
	return a[x]<a[y];
}

void dfs(int x){
	v[x]=1;
	for(int i=g[x];i;i=E[i].to){
		if(!v[E[i].x]) dfs(E[i].x);
	}
}

int get(){
	for(int i=1;i<=n;i++) rem[i]=0;
	int j=1;
	pos[0]=0;
	for(int i=1;i<=n;i++){
		while(j<=n && rem[nt[j]]) j++;
		if(j<=n){
			rem[nt[j]]=1;
			pos[++pos[0]]=nt[j];
		}
	}
	for(int i=1;i<=n;i++) printf("%d ",pos[i]);
	printf("\n");
}

int find(int x){
	int ans=0;
	for(int i=1;i<=n;i++) v[i]=0;
	dfs(x);
	for(int i=1;i<=n;i++) if(v[i]) ans++;
	int tmp=ans;
	for(int i=1;i<=n;i++){
		if(v[nt[i]]) continue;
		tmp++;
		if(a[nt[i]]<=ans) ans++;
		else if(a[nt[i]]<tmp)
			ans=a[nt[i]]+1;
	}
	return ans;
}

int main(){
	freopen("plane.in","r",stdin);
	freopen("plane.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++) nt[i]=i;
	int x,y;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		ade(y,x);
	}
	for(int i=1;i<=n;i++)
		if(!ind[i]){
			q.push(i);
			v[i]=1;
		}
	while(!q.empty()){
		int x=q.front(); q.pop();
		topn[++topn[0]]=x;
		for(int i=g[x];i;i=E[i].to){
			int p=E[i].x;
			a[p]=min(a[p],a[x]-1);
			if((--ind[p])==0) q.push(p);
		}
	}
	sort(nt+1,nt+n+1,cmp);
//	get();
	for(int i=1;i<=n;i++) pre[i]=find(i);
	for(int i=1;i<=n;i++) printf("%d ",pre[i]);
	printf("\n");
	return 0;
}