60pts 求调
  • 板块P1347 排序
  • 楼主SmartCirno
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/19 13:36
  • 上次更新2024/6/19 19:04:58
查看原帖
60pts 求调
1137152
SmartCirno楼主2024/6/19 13:36
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m,ind[128],_ind[128];
vector<int> st,g[128];

bool push_vec(vector<int>* vec,int v)
{
	for(int i:(*vec))if(i==v)return false;
	vec->push_back(v);
	return true;
}

bool toposort(int t)
{
	vector<int> ans;
	queue<int> q;
	
	for(int v:st)
	{
		_ind[v]=ind[v];
		if(_ind[v]==0)
		{
			q.push(v);
		}
	}
	
	while(!q.empty())
	{
		bool flag=false;
		int u=q.front();
		for(int v:g[u])
		{
			if(--_ind[v]==0)
			{
				if(flag)return false;
				else flag=true;
				q.push(v);
			}
		}
		ans.push_back(u);
		q.pop();
	}

	if(ans.size()==n)
	{
		printf("Sorted sequence determined after %d relations: ",t);
		for(int v:ans)cout<<(char)v;
		printf(".");
		return true;
	}
	else if(ans.size()<t)
	{
		printf("Inconsistency found after %d relations.",t);
		return true;
	}
	return false;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		string s;
		cin>>s;
		if(s[0]==s[2])
		{
			printf("Inconsistency found after %d relations.",i);
			return 0;
		}
		push_vec(&st,s[0]);
		push_vec(&st,s[2]);
		if(push_vec(&g[s[0]],s[2]))ind[s[2]]++;
		if(toposort(i))return 0;
	}
	printf("Sorted sequence cannot be determined.");
	return 0;
}
2024/6/19 13:36
加载中...