POJ 1270 Following Orders 토폴로지 정렬

http://poj.org/problem?id=1270
제목 의 대의:
당신 에 게 일련의 서열 을 준 후에 그들 부분의 크기 를 줄 것 입 니 다. 그들 에 게 어 릴 때 부터 큰 모든 배열 을 출력 하 라 고 요구 합 니 다.
그리고 a < b, b < f 그렇게 요구 에 부합 되 는 것 은 abfg 입 니 다.  abgf    agbf  gabf (즉, 나타 나 면 안 됩 니 다 (a 는 b 뒤에 있 고 b 는 f 뒤에 있 습 니 다)
생각:
이 문자 들 을 점 으로 보고 a < b 의 관계 가 존재 한다 면 그림 에 변 v (a, b) 를 만 든 다음 토폴로지 정렬 을 합 니 다.
그런데 이 문제 의 입력 은 아버 지 를 속 였 어 요. 그 크 고 작은 관 계 를 가 진 저 는 4 개 팀 인 줄 알았어 요. 결국 구덩이 에 빠 져 죽 었 어 요. 토론 을 보고 고 쳐 야 지... 처음으로 토폴로지 를 썼어 요...
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=30;
char a[MAXN];
char temp[200];
int map[MAXN][MAXN];
bool vis[MAXN];
int id[MAXN],to[MAXN],route[MAXN];
int len;

void topsort(int cur)
{
	if(cur==len)
	{
		for(int i=0;i<len;i++)
			printf("%c",a[ route[i] ]);
		printf("
"); return; } for(int i=0;i<len;i++) { if(!vis[i] && !to[i]) { for(int j=0;j<len;j++) // 1 if(map[i][j]) to[j]--; vis[i]=true; route[cur]=i; topsort( cur+1 ); for(int j=0;j<len;j++) if(map[i][j]) to[j]++; vis[i]=false; } } } int main() { int kase=0; while(gets(temp)!=NULL) { if(kase) printf("
"); kase++; memset(id,-1,sizeof(id)); memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); memset(to,0,sizeof(to)); len=0; for(int i=0;temp[i]!='\0';i++) if(temp[i] !=' ') a[len++]=temp[i]; sort(a,a+len); for(int i=0;i<len;i++) // , STL map id[ a[i]-'a']=i; gets(temp); bool flag=0; int x; for (int i = 0; temp[i]!='\0'; i++) // i+4 , WA, DISCUSS, AC { if (temp[i] == ' ') continue; if (!flag) x =temp[i] - 'a'; else { map[ id[ x ] ][ id[ temp[i]-'a'] ]=1; to[ id[temp[i]-'a']]++; } flag = !flag; } topsort(0); } return 0; }

좋은 웹페이지 즐겨찾기