Luogu-P1347 (clasificación topológica)

Enlace de asunto https://www.luogu.com.cn/problem/P1347

Dependiendo del problema, es posible que deba verificar cada vez que agregue una ventaja, pero los datos también son pequeños y puede pasarlos.
Los dos pozos están en los comentarios del código.

Código

#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


*/

Supongo que te gusta

Origin blog.csdn.net/jackypigpig/article/details/115268540
Recomendado
Clasificación