intさわだんのBlack History

刹那的レジェンドになりたい。

第7回日本情報オリンピック 春合宿 1日目 問題2 「色紙」 (Sheet)

解法:トポロジカルソート

過去の自分のほうが頭いい気がする。↓

第7回日本情報オリンピック 春合宿 1日目 「色紙」 - intさわだんのBlack History

#include <bits/stdc++.h>

using namespace std;

int n,w,h;
int d[103][103];
bool used[1003];
int ha[1004][4];
int ss[5] = {10001,10001,-1,-1};
int ans[1003];
int co;

void dfs(int x){
	used[x] = true;
	for(int i = ha[x][1];i <= ha[x][3];i++){
		for(int j = ha[x][0];j <= ha[x][2];j++){
			if(used[d[i][j]] == false)dfs(d[i][j]);
		}
	}
	ans[co++] = x;
	return;
}


int main(){
	used[0] = true;
	scanf("%d%d%d",&n,&w,&h);
	for(int i = 1;i <= n;i++){
		used[i] = false;
		for(int j = 0;j < 4;j++){
			ha[i][j] = ss[j];
		}
	}
	for(int i = 1;i <= h;i++){
		for(int j = 1;j <= w;j++){
			int a;
			scanf("%d",&a);
			d[i][j] = a;
			ha[a][0] = min(ha[a][0],j);
			ha[a][1] = min(ha[a][1],i);
			ha[a][2] = max(ha[a][2],j);
			ha[a][3] = max(ha[a][3],i);
		}
	}
	for(int i = 1;i <= h;i++){
		for(int j = 1;j <= w;j++){
			if(used[d[i][j]] == false)dfs(d[i][j]);
		}
	}
	for(int i = 1;i <= n;i++){
		if(used[i] == false)printf("%d ",i);
	}
	for(int i = co-1;i >= 0;i--){
		if(i == 0){
			printf("%d",ans[i]);
		}else{
			printf("%d ",ans[i]);
		}
	}

	printf("\n");
	return 0;
}