#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
vector< int > tab[1010], tree[1010], must[1010], cant[1010], cp, rmust[1010];
vector< int > order;
stack< int > S;
pair< int, pair< int, char > > input[10010];
int n, m, x, y, tim, t, in[1010], out[1010], t1[1010], t2[1010], v, start;
bool pos[1010][1010], blad;
int met[1010];
int ans[1010];
char znak;
void dfs2( int w )
{
	in[w] = ++tim;
	for( int a = 0; a < tree[w].size(); a++ )
	{
		ans[tree[w][a]] = w;
		dfs2( tree[w][a] );
	}	
	out[w] = ++tim;
}
void dfs( int w )
{
	//cout<<"enter "<<w<<endl;
	met[w] = ++t;
	if( tab[w].size() == 0 )return;
//	for( int a = 0; a < tab[w].size(); a++ )cout<<tab[w][a]<<" ";
//	cout<<endl;
	for( int a = 0; a < tab[w].size(); a++ )
	{
		
		if( pos[w][tab[w][a]] )S.push( tab[w][a] );
		else continue;
		while( !S.empty() )
		{
			x = S.top();
			//cout<<"inside "<<x<<endl;
			cp.push_back( x );
			pos[w][x] = 0;
			S.pop();
			for( int b = 0; b < must[x].size(); b++ )
			{
				if( pos[w][must[x][b]] )
				{
					S.push( must[x][b] );
					t1[x]++;	
				}
			}	
			for( int b = 0; b < rmust[x].size(); b++ )
			{
				//cout<<" "<<rmust[x][b]<<endl;
				if( pos[w][rmust[x][b]] )
				{
					S.push( rmust[x][b] );	
					t1[rmust[x][b]]++;
				}
			}
		}
		v = 0;
		random_shuffle( cp.begin(), cp.end() );
		for( int b = 0; b < cp.size(); b++ )
		{
			if( t1[cp[b]] == 0 )v = cp[b];
			t1[cp[b]] = 0;
		}
		//cout<<"chosen "<<w<<" "<<v<<endl;
		if( !v )
		{
			blad = 1;
			return;
		}
		if( v )tree[w].push_back( v );
		while( !cp.empty() )
		{
			if( cp.back() != v )tab[v].push_back( cp.back() ), pos[v][cp.back()] = 1;
			cp.pop_back();
		}	
	}
	for( int a = 0; a < tree[w].size(); a++ )dfs( tree[w][a] );
}
void czysc()
{
	for( int a = 1; a <= n; a++ )
	{
		must[a].clear();
		rmust[a].clear();
		cant[a].clear();
		tab[a].clear();
		t = 0;
		t1[a] = 0;
		t2[a] = 0;
		ans[a] = 0;
		tree[a].clear();
	}
	for( int a = 1; a <= n; a++ )for( int b = 1; b <= n; b++ )pos[a][b] = 0;
	cp.clear();
	tim = 0;
	
}
int main()
{
	ios_base::sync_with_stdio( 0 );
	cin.tie( 0 );
	srand( time( 0 ) );
	cin>>n>>m;
	for( int a = 1; a <= m; a++ )
	{
		cin>>input[a].first>>input[a].second.first>>input[a].second.second;
	}	
	for( int licz = 1; licz <= 5; licz++ )
	{
		for( int a = 1; a <= m; a++ )
		{
			x = input[a].first;
			y = input[a].second.first;
			znak = input[a].second.second;
			if( znak == 'T' )
			{
				must[x].push_back( y );
				rmust[y].push_back( x );
				t1[x] = 1;
			}
			else
			{
				cant[x].push_back( y );
				t2[y] = 1;
			}
		}
		start = 0;
		order.clear();
		for( int a = 1; a <= n; a++ )order.push_back( a );
		random_shuffle( order.begin(), order.end() );
		for( int iter = 0; iter < order.size(); iter++ )
		{
			
			if( t1[order[iter]] == 0 && t2[order[iter]] == 0 )
			{
				start = order[iter];
				break;
			}
		}
		for( int a = 1; a <= n; a++ )t1[a] = 0, t2[a] = 0;
		if( !start )
		{
			cout<<"NIE";
			return 0;	
		}
		for( int a = 1; a <= n; a++ )if( a != start )tab[start].push_back( a ), pos[start][a] = 1;
		//cout<<"ok "<<start<<endl;
		dfs( start );
		++t;
		if( !blad )
		{	
			dfs2( start );
			//cout<<"ok ok"<<endl;
			for( int a = 1; a <= n; a++ )
			{
				for( int b = 0; b < must[a].size(); b++ )
				{
					if( in[must[a][b]] > in[a] || out[must[a][b]] < out[a] )blad = 1;
				}
				for( int b = 0; b < cant[a].size(); b++ )
				{
					if( in[cant[a][b]] < in[a] && out[cant[a][b]] > out[a] )blad = 1;	
				}
			}
		}
		if( !blad )break;
		czysc();
	}
	if( blad )
	{
		cout<<"NIE";
		return 0;	
	}
	else
	{	
		//cout<<"TAK";
		//cout<<endl<<endl;
		for( int a = 1; a <= n; a++ )cout<<ans[a]<<endl;	
	}
	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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | #include<bits/stdc++.h> #define endl '\n' using namespace std; vector< int > tab[1010], tree[1010], must[1010], cant[1010], cp, rmust[1010]; vector< int > order; stack< int > S; pair< int, pair< int, char > > input[10010]; int n, m, x, y, tim, t, in[1010], out[1010], t1[1010], t2[1010], v, start; bool pos[1010][1010], blad; int met[1010]; int ans[1010]; char znak; void dfs2( int w ) { in[w] = ++tim; for( int a = 0; a < tree[w].size(); a++ ) { ans[tree[w][a]] = w; dfs2( tree[w][a] ); } out[w] = ++tim; } void dfs( int w ) { //cout<<"enter "<<w<<endl; met[w] = ++t; if( tab[w].size() == 0 )return; // for( int a = 0; a < tab[w].size(); a++ )cout<<tab[w][a]<<" "; // cout<<endl; for( int a = 0; a < tab[w].size(); a++ ) { if( pos[w][tab[w][a]] )S.push( tab[w][a] ); else continue; while( !S.empty() ) { x = S.top(); //cout<<"inside "<<x<<endl; cp.push_back( x ); pos[w][x] = 0; S.pop(); for( int b = 0; b < must[x].size(); b++ ) { if( pos[w][must[x][b]] ) { S.push( must[x][b] ); t1[x]++; } } for( int b = 0; b < rmust[x].size(); b++ ) { //cout<<" "<<rmust[x][b]<<endl; if( pos[w][rmust[x][b]] ) { S.push( rmust[x][b] ); t1[rmust[x][b]]++; } } } v = 0; random_shuffle( cp.begin(), cp.end() ); for( int b = 0; b < cp.size(); b++ ) { if( t1[cp[b]] == 0 )v = cp[b]; t1[cp[b]] = 0; } //cout<<"chosen "<<w<<" "<<v<<endl; if( !v ) { blad = 1; return; } if( v )tree[w].push_back( v ); while( !cp.empty() ) { if( cp.back() != v )tab[v].push_back( cp.back() ), pos[v][cp.back()] = 1; cp.pop_back(); } } for( int a = 0; a < tree[w].size(); a++ )dfs( tree[w][a] ); } void czysc() { for( int a = 1; a <= n; a++ ) { must[a].clear(); rmust[a].clear(); cant[a].clear(); tab[a].clear(); t = 0; t1[a] = 0; t2[a] = 0; ans[a] = 0; tree[a].clear(); } for( int a = 1; a <= n; a++ )for( int b = 1; b <= n; b++ )pos[a][b] = 0; cp.clear(); tim = 0; } int main() { ios_base::sync_with_stdio( 0 ); cin.tie( 0 ); srand( time( 0 ) ); cin>>n>>m; for( int a = 1; a <= m; a++ ) { cin>>input[a].first>>input[a].second.first>>input[a].second.second; } for( int licz = 1; licz <= 5; licz++ ) { for( int a = 1; a <= m; a++ ) { x = input[a].first; y = input[a].second.first; znak = input[a].second.second; if( znak == 'T' ) { must[x].push_back( y ); rmust[y].push_back( x ); t1[x] = 1; } else { cant[x].push_back( y ); t2[y] = 1; } } start = 0; order.clear(); for( int a = 1; a <= n; a++ )order.push_back( a ); random_shuffle( order.begin(), order.end() ); for( int iter = 0; iter < order.size(); iter++ ) { if( t1[order[iter]] == 0 && t2[order[iter]] == 0 ) { start = order[iter]; break; } } for( int a = 1; a <= n; a++ )t1[a] = 0, t2[a] = 0; if( !start ) { cout<<"NIE"; return 0; } for( int a = 1; a <= n; a++ )if( a != start )tab[start].push_back( a ), pos[start][a] = 1; //cout<<"ok "<<start<<endl; dfs( start ); ++t; if( !blad ) { dfs2( start ); //cout<<"ok ok"<<endl; for( int a = 1; a <= n; a++ ) { for( int b = 0; b < must[a].size(); b++ ) { if( in[must[a][b]] > in[a] || out[must[a][b]] < out[a] )blad = 1; } for( int b = 0; b < cant[a].size(); b++ ) { if( in[cant[a][b]] < in[a] && out[cant[a][b]] > out[a] )blad = 1; } } } if( !blad )break; czysc(); } if( blad ) { cout<<"NIE"; return 0; } else { //cout<<"TAK"; //cout<<endl<<endl; for( int a = 1; a <= n; a++ )cout<<ans[a]<<endl; } return 0; } | 
 
            
         English
                    English