90pts求条
  • 板块P1347 排序
  • 楼主UNAFO
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/3 13:02
  • 上次更新2024/9/3 19:49:12
查看原帖
90pts求条
1032219
UNAFO楼主2024/9/3 13:02
#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[500005],cnt;
struct data{
	int to;
	int next;
};
data edge[100005];
void add_edge(int from,int to){
	cnt++;
	edge[cnt].to=to;
	edge[cnt].next=head[from];
	head[from]=cnt;
}
int n,m;
int degree[1005];
int t_degree[1005];
string ans;
void toposort(){
	queue<int> q;
	bool flag=false;
	int kk=0;
	for(int i=1;i<=n;i++){
		if(degree[i]==0){
			kk++;
			q.push(i);
		}
	}
	if(kk>=2) flag=true;
	int ans1=0;
	while(!q.empty()){
		int sum=0;
		int x=q.front();
		q.pop();
		ans=ans+char(x+'A'-1);
		for(int i=head[x];i;i=edge[i].next){
			degree[edge[i].to]--;
			ans1=max(ans1,i);
			if(degree[edge[i].to]==0){
				q.push(edge[i].to);
				sum++;
				if(sum>=2) flag=true;
			}
		}
	}
	if(flag) cout<<"Sorted sequence cannot be determined.";
	else {
		cout<<"Sorted sequence determined after ";
		cout<<ans1;
		cout<<" relations:";
		cout<<ans<<".";
	}
	return;
}

bool circle(){
	queue<int> q;
	for(int i=1;i<=n;i++){
		t_degree[i]=degree[i];
	}
	for(int i=1;i<=n;i++){
		if(t_degree[i]==0) q.push(i);
	}
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=edge[i].next){
			t_degree[edge[i].to]--;
			if(t_degree[edge[i].to]==0) q.push(edge[i].to);
		}
	}
	for(int i=1;i<=n;i++){
		if(t_degree[i]) return false;
	}
	return true;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		string s;
		cin>>s;
		int u=s[0]-'A'+1;
		int v=s[2]-'A'+1;
		add_edge(u,v);
		degree[v]++;
		if(!circle()){
			cout<<"Inconsistency found after "<<i<<" relations.";
			return 0;
		}
	}
	toposort();
	return 0;
}
2024/9/3 13:02
加载中...