为啥开了O2就wa了一个点,不开就过了,而且对照测试点输出的一模一样
  • 板块P1347 排序
  • 楼主xiaoyaohanzi
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/7/7 11:32
  • 上次更新2023/10/27 21:38:22
查看原帖
为啥开了O2就wa了一个点,不开就过了,而且对照测试点输出的一模一样
607785
xiaoyaohanzi楼主2022/7/7 11:32

源码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int N = 40,M = 610;
int h[N],e[M],ne[M],idx,din[N],temp_din[N];
int mode = 0;
int n,m;
string ans = "";

void add(int a,int b)
{
	ne[idx] = h[a],e[idx] = b,h[a] = idx ++;
	din[b] ++;
}

void topsort()
{
	ans = "";
	mode = 0;
	bool key;
	queue<int> q;
	for(int i = 1; i <= n; i ++)
		temp_din[i] = din[i];
	for(int i = 1; i <= n; i ++)
		if(!temp_din[i])
			q.push(i);
	if(q.size() > 1)
		key = true;
	while(q.size())
	{
		int k = q.front();
		ans += char(k+'A'-1);
		q.pop();
		for(int i = h[k];~i;i = ne[i])
		{
			int j = e[i];
			temp_din[j] --;
			if(!temp_din[j])
				q.push(j);
		}
		if(q.size()>1)
			key = true;		 
	}
	if(ans.size() < n)
		mode = 1;
	if(ans.size() == n&&!key)
		mode = 2;
}

int main()
{
	cin>>n>>m;
	memset(h,-1,sizeof(h));
	string temp;
	for(int i = 1; i <= m; i ++)
	{
		cin>>temp;
		add(temp[0] - 'A'+1,temp[2] - 'A'+1);
		topsort();
//		cout<<ans<<endl;
		if(mode == 1)
		{
			cout<<"Inconsistency found after "<<i<<" relations.\n";
			return 0;
		}
		if(mode == 2)
		{
			cout<<"Sorted sequence determined after "<<i<<" relations: "<<ans<<".\n";
			return 0;
		}
	}
	cout<<"Sorted sequence cannot be determined.\n";
    return 0;
}

测试点

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

幸好可以看数据,不然得修半天

2022/7/7 11:32
加载中...