80分求救...求大佬~
  • 板块P1347 排序
  • 楼主Kogenta
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/6/29 21:42
  • 上次更新2023/11/4 21:18:31
查看原帖
80分求救...求大佬~
386890
Kogenta楼主2021/6/29 21:42

二维数组判环在先,判不确定在其次(如果有某个点导致同时两个点入度为0则cannot be determined),此时拓扑排序如果能排到n个点,直接输出顺序即可...

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=27;
vector<int>v[maxn],id[maxn];
int n,m;
bool conn[maxn][maxn];
int mark;
int in[maxn];
int ans[maxn];
int anscnt=0;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		in[i]=0;
	}
	bool vis=0;
	int mark;
	for(int i=1;i<=m;i++){
		string str;
		cin>>str;
		if(vis==1) continue;
		int now1=str[0]-'A'+1,now2=str[2]+1-'A';
		if(conn[now1][now2]==1) continue;
		if(conn[now2][now1]==1){
			vis=1;
			mark=i;
		}
		conn[now1][now2]=1;
		v[now1].push_back(now2);
		id[now1].push_back(i);
		in[now2]++;
		for(int j=1;j<=n;j++){
			if(conn[j][now1]==1){
				conn[j][now2]=1;
			}
			if(conn[now2][j]==1){
				conn[now1][j]=1;
			}
		}
	}
	if(vis==1){
		cout<<"Inconsistency found after "<<mark<<" relations."<<endl;
		return 0;
	}
	queue<int>q;
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			cnt++;
			q.push(i);
			ans[++anscnt]=i;
			if(cnt==2){
				cout<<"Sorted sequence cannot be determined."<<endl;
				return 0;
			}
		}
	}
	int maxrec=0;
	while(!q.empty()){
		cnt=0;
		int now=q.front();
		q.pop();
		for(int i=0;i<v[now].size();i++){
			maxrec=max(maxrec,id[now][i]);
			int newn=v[now][i];
			in[newn]--;
			if(in[newn]==0){
				ans[++anscnt]=newn;
				cnt++;
				if(cnt==2){
					cout<<"Sorted sequence cannot be determined."<<endl;
					return 0;
				}
				if(anscnt==n){
					cout<<"Sorted sequence determined after "<<maxrec<<" relations: ";
					for(int i=1;i<=n;i++){
						char k=ans[i]+'A'-1;
						cout<<k;
					}
					cout<<"."<<endl;
					return 0;
				}
				q.push(newn);
			}
		}	
	}
	cout<<"Sorted sequence cannot be determined."<<endl;
	return 0;
}
2021/6/29 21:42
加载中...