拓扑排序30pts求调
  • 板块P1347 排序
  • 楼主HZHDCM
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/15 21:35
  • 上次更新2024/3/16 08:34:09
查看原帖
拓扑排序30pts求调
817681
HZHDCM楼主2024/3/15 21:35
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=27;
int d[N],a[N],t,ans[N],d2[N];
vector<int> A[N];

int topo(){//topo==1矛盾,topo==2ok,topo==3不够
    memset(a,0,sizeof(a));
    memset(ans,0,sizeof(ans));
    int yuyu=0;
    queue<int> q;
    int pui=0;
	for(int i=1;i<=n;i++){
		if(!d[i]){q.push(i);pui++;if(pui>1)return 3;yuyu++;}
	}
	if(q.empty())return 1;
	t=0;
	while(!q.empty()){
		int l=q.front();
		ans[l]=0;
		a[++t]=l;
		q.pop();
		for(int i=0;i<A[l].size();i++){
			int u=A[l][i];
			if(!--d[u]){
				q.push(u);
				ans[l]++;
				if(ans[l]>1)return 3;
				yuyu++;
			}
		}
	}
	if(yuyu<n)return 1;
	return 2;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		char aa,b,c;
		cin>>aa>>b>>c;
		A[aa-'A'+1].push_back(c-'A'+1);
		d[c-'A'+1]++;
		d2[c-'A'+1]++;
		t=0;
		int pd=topo();
		if(pd==1){
			cout<<"Inconsistency found after "<<i<<" relations.";
			return 0;
		}
		else if(pd==2){
			cout<<"Sorted sequence determined after "<<i<<" relations: ";
			for(int i=1;i<=t;i++){
				int ppp=a[i]+65-1;
				cout<<char(ppp);
			}
			cout<<".";
			return 0;
		}
		for(int j=1;j<=n;j++){
			d[j]=d2[j];
		}
	}
	cout<<"Sorted sequence cannot be determined.";
	return 0;
}
2024/3/15 21:35
加载中...