#include <stdio.h>
#include <set>
#include <algorithm>
#define MAX 1010
std::vector<int> vertexs[MAX];
std::set<int> notLike[MAX];
std::set<int> mustLike[MAX];
std::vector<int> sorted;
char visited[MAX];
int position[MAX];
void dfs(int n, int v)
{
	visited[v] = 1;
	for(int i : vertexs[v])
		if (visited[i] == 1)
		{
			printf("NIE\n");
			exit(0);
		}
		else if (visited[i] == 0)
			dfs(n, i);
	sorted.push_back(v);
	visited[v] = 2;
}
int main()
{
	int n, m, a, b;
	char c;
	scanf("%d %d", &n, &m);
	for (int i=0; i<m; ++i)
	{
		scanf("%d %d %c", &a, &b, &c);
		if (c == 'T')
		{
			vertexs[a].push_back(b);
			mustLike[a].insert(b);
		}
		else
			notLike[a].insert(b);
	}
	int startedVertex = 0;
	for (int i=1; i<=n; ++i)
	{
		bool ok = true;
		if (!mustLike[i].empty())
		{
			continue;
		}
		for (int j=1; j<=n; ++j)
		{
			if (i != j && notLike[j].count(i) != 0)
			{
				ok = false;
				break;
			}
		}
		if (ok)
		{
			startedVertex = i;
			break;
		}
	}
	if (startedVertex == 0)
	{
		printf("NIE\n");
		return 0;
	}
	dfs(n, startedVertex);
	for (int i=1; i<=n; ++i)
		if (i != startedVertex && visited[i] == 0)
			dfs(n, i);
	int p=0;
	for (int v : sorted)
	{
		position[v] = p++;
		for (int i : vertexs[v])
			for (int i2 : mustLike[i])
				mustLike[v].insert(i2);
		std::vector<int> diff;
		std::set_intersection(mustLike[v].begin(), mustLike[v].end(), notLike[v].begin(), notLike[v].end(), std::inserter(diff, diff.begin()));
		if (!diff.empty())
		{
			printf("NIE\n");
			return 0;
		}
	}
	position[sorted.front()] = MAX;
	for (int v=1; v<=n; ++v)
	{
		int minVertex = sorted.front();
		for (int i : vertexs[v])
			if (position[i] < position[minVertex])
				minVertex = i;
		if (v == sorted.front())
			printf("0\n");
		else
			printf("%d\n", minVertex);
	}
	return 0;
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <stdio.h> #include <set> #include <algorithm> #define MAX 1010 std::vector<int> vertexs[MAX]; std::set<int> notLike[MAX]; std::set<int> mustLike[MAX]; std::vector<int> sorted; char visited[MAX]; int position[MAX]; void dfs(int n, int v) { visited[v] = 1; for(int i : vertexs[v]) if (visited[i] == 1) { printf("NIE\n"); exit(0); } else if (visited[i] == 0) dfs(n, i); sorted.push_back(v); visited[v] = 2; } int main() { int n, m, a, b; char c; scanf("%d %d", &n, &m); for (int i=0; i<m; ++i) { scanf("%d %d %c", &a, &b, &c); if (c == 'T') { vertexs[a].push_back(b); mustLike[a].insert(b); } else notLike[a].insert(b); } int startedVertex = 0; for (int i=1; i<=n; ++i) { bool ok = true; if (!mustLike[i].empty()) { continue; } for (int j=1; j<=n; ++j) { if (i != j && notLike[j].count(i) != 0) { ok = false; break; } } if (ok) { startedVertex = i; break; } } if (startedVertex == 0) { printf("NIE\n"); return 0; } dfs(n, startedVertex); for (int i=1; i<=n; ++i) if (i != startedVertex && visited[i] == 0) dfs(n, i); int p=0; for (int v : sorted) { position[v] = p++; for (int i : vertexs[v]) for (int i2 : mustLike[i]) mustLike[v].insert(i2); std::vector<int> diff; std::set_intersection(mustLike[v].begin(), mustLike[v].end(), notLike[v].begin(), notLike[v].end(), std::inserter(diff, diff.begin())); if (!diff.empty()) { printf("NIE\n"); return 0; } } position[sorted.front()] = MAX; for (int v=1; v<=n; ++v) { int minVertex = sorted.front(); for (int i : vertexs[v]) if (position[i] < position[minVertex]) minVertex = i; if (v == sorted.front()) printf("0\n"); else printf("%d\n", minVertex); } return 0; } | 
 
            
         English
                    English