#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
const int maxn = 12;
int n;
char maze[maxn][maxn],str[maxn*maxn];
int vis[maxn];
vector<int> son[maxn],topo;
int ans[maxn];
void dfs(int u){
vis[u]=1;
for(int i=0;i<son[u].size();i++) if(!vis[son[u][i]]){
dfs(son[u][i]);
}
topo.push_back(u);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
scanf("%s",str);
memset(maze,0,sizeof(maze));
for(int i=0;i<=n;i++) son[i].clear();
int k=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++){
switch(str[k++]){
case '+': son[j].push_back(i-1); break;
case '-': son[i-1].push_back(j); break;
case '0': maze[i-1][j]=maze[j][i-1]=1; break;
}
}
memset(vis,0,sizeof(vis));
topo.clear();
for(int i=0;i<=n;i++){
if(!vis[i]) dfs(i);
}
int p;
for(int i=0;i<topo.size();i++){
if(topo[i]==0) {p=i; break;}
}
int j=0;
for(int i=p-1;i>=0;i--){
if(maze[topo[i]][topo[i+1]]) ans[topo[i]]=j;
else ans[topo[i]]= (--j);
} j=0;
for(int i=p+1;i<topo.size();i++){
if(maze[topo[i]][topo[i-1]]) ans[topo[i]]=j;
else ans[topo[i]]= (++j);
}
for(int i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%d",ans[i]-ans[i-1]);
}
printf("\n");
}
return 0;
}
UVA - 1423 (大小关系的拓扑排序)
最新推荐文章于 2021-05-17 10:21:00 发布