Luogu-P1347 (tri topologique)

Lien sujet https://www.luogu.com.cn/problem/P1347

Selon le problème, vous devrez peut-être vérifier chaque fois que vous ajoutez un bord, mais les données sont également petites et vous pouvez les transmettre.
Les deux fosses se trouvent dans les commentaires de code.

Code

#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector<int> graph[30];
int n, m;
char s[5],ans[30];
int ru[30],vis[30];
//vis 用来记录是否涉及到这个点了 


int solve()
{
    
    
	int r[30],c[30];
	for (int i=0; i<26; i++)
		r[i]=ru[i];
	
	queue<int> q;
	int cnt=0;
	int tag=0; 
	
	for (int i=0; i<n; i++)
		if (vis[i] && r[i]==0)
			q.push(i);
	
	while (!q.empty())
	{
    
    
		if (q.size()>1)
		{
    
    
			tag=1;		//坑点1:因为要求完全确认顺序,出现多个在队列里说明无法确认 
		}
		int u=q.front();
		ans[cnt++]=u+'A';
		q.pop();
		//for (int v: graph[u])
		for (int i=graph[u].size()-1,v; i>=0; i--)
			if (--r[v=graph[u][i]]==0)
				q.push(v);
	}
	
	ans[cnt]=0; 
	
	for (int i=0; i<n; i++)
		if (r[i])
			return -1;	//矛盾(有环) 
	
	if (cnt<n || tag==1)
		return 0;	//未匹配完 
		
	return 1;	//成功 
}


int main()
{
    
    
	scanf("%d%d", &n, &m);
	for (int i=1; i<=m; i++)
	{
    
    
		scanf("%s",s);
		graph[s[0]-'A'].push_back(s[2]-'A');
		ru[s[2]-'A']++;
		vis[s[0]-'A']=1;
		vis[s[2]-'A']=1;
		int flag=solve();
		if (flag==-1)	//矛盾 
		{
    
    
			printf("Inconsistency found after %d relations.\n", i);
			return 0;
		}
		else if (flag==1)	//成功 
		{
    
    
			printf("Sorted sequence determined after %d relations: %s.\n", i, ans);		//坑点2:%s后面要个句号... 
			return 0;
		}
	}
	
	printf("Sorted sequence cannot be determined.\n");
	return 0;
}

/*
4 6
C<D
C<B
B<A
C<D
D<A
A<A

26 25
A<C
C<E
E<G
G<I
I<K
K<M
M<O
O<Q
Q<S
S<U
U<W
W<Y
Y<Z
Z<B
B<D
D<F
F<H
H<J
J<L
L<N
N<P
P<R
R<T
T<V
V<X


*/

Je suppose que tu aimes

Origine blog.csdn.net/jackypigpig/article/details/115268540
conseillé
Classement