Guess
题意:
拓扑排序
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=12; 5 int p[maxn][maxn],b[maxn]; 6 int in[maxn]; 7 int n; 8 9 void top_sort(){ 10 queue<int> q; 11 for(int i=0;i<=n;i++) if(in[i]==0) q.push(i); 12 while(!q.empty()){ 13 int x=q.front(); 14 q.pop(); 15 for(int i=0;i<=n;i++) if(p[x][i]==1){ 16 b[i]=b[x]-1; 17 in[i]--; 18 if(in[i]==0) q.push(i); 19 } 20 } 21 } 22 int main(){ 23 int t; 24 scanf("%d",&t); 25 b[0]=0; 26 while(t--){ 27 memset(b,0,sizeof(b)); 28 memset(p,0,sizeof(p)); 29 memset(in,0,sizeof(in)); 30 scanf("%d",&n); 31 getchar(); 32 int m=(n+1)*n/2; 33 char s; 34 for(int i=1;i<=n;i++){ 35 for(int j=i;j<=n;j++){ 36 scanf("%c",&s); 37 if(s=='+') p[j][i-1]=1,in[i-1]++; 38 else if(s=='-') p[i-1][j]=1,in[j]++; 39 } 40 } 41 top_sort(); 42 for(int i=1;i<=n;i++) printf("%d%c",b[i]-b[i-1],i==n?' ':' '); 43 } 44 }