拓扑排序90分,第9点WA了但是本地测没有问题 求调
  • 板块P1347 排序
  • 楼主哈德门弟
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/2/22 20:43
  • 上次更新2023/10/28 07:56:07
查看原帖
拓扑排序90分,第9点WA了但是本地测没有问题 求调
187859
哈德门弟楼主2022/2/22 20:43
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#define MAX 2022
#define mod 80112002
#define SPACE putchar(' ');
using namespace std;
inline int read(){//读入一个整数
	int x=0,f=1;
    char c=getchar();
    while(c<48||c>57) c=getchar(); if(c=='-')f=-1;
    while(c>47&&c<58) x*=10,x+=c-48,c=getchar();
    return x*f;
}
inline void out(int x){//输出一个整数,由于分离数位只能倒序输出,不如用递归
    if(x<0) putchar('-'), x=-x;
    if(x>=10) out(x/10);
    char a=x%10+'0';
    putchar(a);
}
struct data{
    int v,d;
};
void swap(int &a,int &b){
    int t=a;
        a=b;
        b=t;
    return;
}
int topsort();
char s[29];
int n,m,head[MAX],nxt[MAX],edge[MAX],tip,deg[MAX],cnt,N;
bool vis[MAX],flag;
int main(){
    n=read(),m=read();
    for(int i=1;i<=m;i++){
        char C,D,op,mem; getchar();//本地测要把这个注释掉
        scanf("%c%c%c",&C,&op,&D);getchar();
        int c=C-'A'+1,d=D-'A'+1; if(op=='>') swap(c,d);//c->d
        if(!vis[c])N++; if(!vis[d])N++;
        vis[c]=vis[d]=true;
        edge[++tip]=d; nxt[tip]=head[c]; head[c]=tip;
        deg[d]++;
        int key=topsort();//1完成2未完成3矛盾
        if(key==1) {printf("Sorted sequence determined after %d relations: %s",i,s);flag=true;break;}
        else if(key==2) continue;
        else if(key==3){printf("Inconsistency found after %d relations.",i);flag=true;break;}
    }
    if(!flag)printf("Sorted sequence cannot be determined.");
    return 0;
}
int topsort(){
    queue<data> q; int ans=0,redeg[MAX],num=N;
    cnt=0;
    for(int i=1;i<=n;i++){
        redeg[i]=deg[i];
        if(!redeg[i]&&vis[i]) q.push({i,1}),num--;
    }
    while(!q.empty()){
        int k=q.front().v,D=q.front().d; q.pop();
        s[cnt++]=char(k+'A'-1);
        for(int i=head[k];i;i=nxt[i]){
            int node=edge[i];
            redeg[node]--;
            if(!redeg[node]) q.push({node,D+1}),num--;
        }
        ans=max(ans,D);
    }
    if(num)return 3;
    else if(ans==n)return 1;
    else return 2;
}
2022/2/22 20:43
加载中...