出来的topo序错了,为啥?蒟蒻求助。
  • 板块P1347 排序
  • 楼主oiyang
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/28 22:39
  • 上次更新2023/11/3 12:12:00
查看原帖
出来的topo序错了,为啥?蒟蒻求助。
856309
oiyang楼主2023/6/28 22:39
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int maxline=605;
int head[27],k;
struct edge{int to,pre;}line[maxline*2];
void addline(int u,int v)
{
	k++;
	line[k].to=v;
	line[k].pre=head[u];
	head[u]=k;
}
int ind[27];
queue<int>q;
int cnt;
int topu[27];
bool pd;
int cnt_zero;
struct node{int u,v;}a[maxline];
int topo()
{
	for(int i=1;i<=n;i++)
		if(ind[i]==0)
			cnt_zero++,q.push(i),cnt++,topu[cnt]=i;
	if(cnt_zero>1)
		return 0;
	while(!q.empty())
	{
		int top=q.front();
		q.pop();
		for(int i=head[top];i;i=line[i].pre)
		{
			int v=line[i].to;
			ind[v]--;
			if(!ind[v])
				cnt++,topu[cnt]=v;
		}
	}
	if(cnt!=n)
		return -1;
	return 1;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		string s;
		cin>>s;
		int u=s[0]-'A'+1,v=s[2]-'A'+1;
		a[i].u=u,a[i].v=v;
	}
	for(int i=1;i<=m;i++)
	{
		addline(a[i].u,a[i].v);
		memset(ind,0,sizeof(ind));
		cnt=0;
		cnt_zero=0;
		for(int j=1;j<=i;j++)
			ind[a[j].v]++;
		int ans=topo();
		if(ans==1)
		{
			cout<<"Sorted sequence determined after "<<i<<" relations: ";
			for(int j=1;j<=n;j++)
				cout<<(char)(topu[j]+'A'-1);
			cout<<".";
			return 0;
		}
		if(ans==-1)
		{
			cout<<"Inconsistency found after "<<i<<" relations.";
			return 0;
		}
	}
	cout<<"Sorted sequence cannot be determined.";
	return 0;
}
2023/6/28 22:39
加载中...