#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<stack>
using namespace std;
const int maxn=15;
int c[maxn];
int G[maxn][maxn];
vector<int> topo;
int n;
bool dfs(int u)
{
c[u]=-1;
for(int v=0;v<=n;v++)if(G[u][v])
{
if(c[v]<0)return false;
else if(!c[v]&&!dfs(v))return false;
}
c[u]=1;
topo.push_back(u);
return true;
}
int fa[maxn];
int find(int x)
{
return fa[x]!= x ? fa[x]=find(fa[x]) : x;
}
bool toposort()
{
//t=n+1;
topo.clear();
memset(c,0,sizeof(c));
for(int u=0;u<=n;u++)if(!c[u])
if(!dfs(u))return false;
reverse(topo.begin(),topo.end());
return true;
}
int main()
{
int T;
scanf("%d",&T);
getchar();
int sum[15];
char S[15][15];
char input[110];
while(T--)
{
scanf("%d",&n);
getchar();
scanf("%s",input);
for(int i=0;i<=n;i++)fa[i]=i;
int idx=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
S[i][j]=input[idx++];
if(S[i][j]=='0')fa[j]=i-1;
}
}
memset(G,0,sizeof(G));
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(S[i][j]=='-')G[find(j)][find(i-1)]=1;
if(S[i][j]=='+')G[find(i-1)][find(j)]=1;
}
}
toposort();
int cur=0;
for(int i=0;i<=n;i++)sum[topo[i]]=cur++;
for(int i=1;i<=n;i++)
{
sum[i]=sum[find(i)];
if(i>1)printf(" ");
printf("%d",sum[i]-sum[i-1]);
}
printf("\n");
}
return 0;
}
LA4255 Guess (拓扑排序)
最新推荐文章于 2018-08-21 13:23:53 发布