题目链接 https://www.luogu.com.cn/problem/P1347
依题目,可能需要每加一条边就验算一次,不过数据也小,可以过。
两个坑点,都在代码注释里面了。
代码
#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
*/