0%

P1347 排序

思路讲解

图论建模,拓扑排序。

拓扑排序的代码(使用BFS kahn‘s算法),通过判断q的大小可以知道其是不是严格的(该题目要求严格的顺序)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ll trop(const vector<ll> &a,ll siz){
vector<ll> op=a;
Ans.clear();
queue<ll> q;
ll ret=3; // 3成功 2不能确定 1冲突
FOR(i,'A','Z'){
if(vis[i] && op[i]==0) q.push(i),Ans.pb(i);
}
if(SZ(q)>1) ret=2;
while(!q.empty()){
if(SZ(q)>1) ret=2;
ll node=q.front();q.pop();
ll cnt=0;
FOR(i,0,SZ(g[node])-1){
ll lnode=g[node][i];
op[lnode]-=1;
if(op[lnode]==0){
q.push(lnode);
Ans.pb(lnode);
}
}
}
if(SZ(Ans)==siz){
if(SZ(Ans)<N){ // 还没完全确定
return 2;
}else{
return ret;
}
}else{ // 说明有环
return 1;
}
}

AC代码

https://www.luogu.com.cn/record/220236107

心路历程(WA,TLE,MLE……)