poj 2367 Genealogical tree (拓扑排序)

火星人的血缘关系很奇怪,一个人可以有很多父亲,当然一个人也可以有很多孩子。
有些时候分不清辈分会产生一些尴尬。所以写个程序来让n个人排序,长辈排在晚辈前面。

输入:N 代表n个人 1~n 接下来n行 第i行表示第i个人的孩纸,无序排列,可能为空。0代表一行输入结束。

(大概我的智商真的不合适,否则怎么这么久了连个拓扑排序都写不好,T了三次。。)

代码:

/********************************************
Problem: 2367		User:
Memory: 700K		Time: 32MS
Language: G++		Result: Accepted
********************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const int N = 105;
int n;
vector<int> G[N];
int RD[N];
int vis[N];

void topsort()
{
	for (int j = 1; j <= n; ++j)
		for (int i = 1; i <= n; ++i) {
			if (!vis[i] && RD[i] == 0) {

				if (j != 1) printf(" ");
				printf("%d", i);
				for (int k = 0; k < G[i].size(); ++k)
					--RD[G[i][k]];
				vis[i] = 1;
				break;
			}
		}
	printf("
");
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		int temp;
		while (scanf("%d", &temp) == 1) {
			if (temp == 0) break;
			G[i].push_back(temp);
			++RD[temp];
		}
	}
	topsort();
    return 0;
}

  

好吧,改了一下第一次的代码也A了,输入的问题= =#

/****************************************
Problem: 2367		User: 
Memory: 736K		Time: 0MS
Language: G++		Result: Accepted
****************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const int N = 105;

int mp[N][N]; // mp[i][j] i is j's son
int vis[N];
int n;

void read(int i)
{
	char ch;
	int ans = 0;
	
	while (scanf("%d", &ch), ch) {
		mp[ch][i] = 1;
		++mp[ch][0];
	}
}

void tpsort()
{
	int i, j;
	for (j = 1; j <= n; ++j) {
		for (i = 1; i <= n; ++i) {
			if (!vis[i] && mp[i][0] == 0) {
				if (j != 1) printf(" ");
				printf("%d", i);
				vis[i] = 1;

				for (int k = 1; k <= n; ++k) {
					if (!vis[k] && mp[k][i] == 1) {
						mp[k][i] = 0;
						--mp[k][0];
					}
				}
				break;
			}
		}
	}
	printf("
");
}

int main()
{
    scanf("%d", &n);
	getchar();
	memset(mp, 0, sizeof mp);
	memset(vis, 0, sizeof vis);
	for (int i = 1; i <= n; ++i) {
		read(i);
	}
	tpsort();
    return 0;
}

  

原文地址:https://www.cnblogs.com/wenruo/p/4719203.html