UVALive 6467 Strahler Order 拓扑排序

时间:2022-05-22 17:03:37

这题是今天下午BNU SUMMER TRAINING的C题

是队友给的解题思路,用拓扑排序然后就可以了

最后是3A

其中两次RE竟然是因为:

scanf("%d",mm);

ORZ

以后能用CIN还是CIN吧  QAQ

贴代码了:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm> #define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
int indgree[MAXN], map[MAXN][MAXN], ans[MAXN], cur[MAXN][MAXN];
int n;
void init(){
for(int i = ; i <= n; ++i){
for(int j = ; j <= n; ++j){
map[i][j] = i == j ? : INF;
}
}
memset(indgree, , sizeof(indgree));
memset(ans, , sizeof(ans));
memset(cur, , sizeof(cur));
} void insert_cur(int x, int num){
int pos = ;
while(){
if(cur[x][pos] == ){
cur[x][pos] = num;
break;
}
++pos;
}
} int sigma_cur(int x){
int temp_ans = ;
int Max = -INF;
for(int i = ; cur[x][i] != ; ++i){
if(cur[x][i] > Max) Max = cur[x][i];
}
int flag = ;
for(int i = ; cur[x][i] != ; ++i){
if(cur[x][i] == Max) ++flag;
}
if(flag >= ) ans[x] = ++Max;
else if(flag == ) ans[x] = Max;
return ans[x];
} void topsort(){
int i, j;
while(){
for(i = ; i <= n; ++i)
if(indgree[i] == ) break;
if(i != n + ){
for(j = ; j <= n; ++j)
if(map[i][j] == ){
map[i][j] = ;
--indgree[j];
insert_cur(j, ans[i]);
if(indgree[j] == ) ans[j] = sigma_cur(j);
}
indgree[i] = -;//pop i
}
else break;
}
} int main(){
int i, j, k, p, mm, a, b;
scanf("%d",&mm);
int numCase = ;
while(mm--){
init();
scanf("%d%d%d",&k,&n,&p);
while(p--){
scanf("%d%d",&a,&b);
++indgree[b];
map[a][b] = ;
}
for(i = ; i <= n; ++i){
if(indgree[i] == ) ans[i] = ;
}
topsort();
printf("%d %d\n",++numCase,ans[n]);
}
return ;
}