刘书上例题 拓扑排序
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 105
#define INF 0x7fffffff
#define inf 10000000
#define MOD 1000000007
#define ull unsigned long long
#define ll long long
using namespace std;
char s[110];
bool g[20][20];
int in[20], a[20], n;
void init()
{
memset(g, 0, sizeof(g));
memset(in, 0, sizeof(in));
memset(a, 0, sizeof(a));
}
void topo()
{
queue<int> q;
int cnt = 1;
for(int i = 0; i <= n; ++ i) if(!in[i]) q.push(i);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int v = 0; v <= n; ++ v)
{
if(g[u][v])
{
in[v] --;
if(!in[v])
{
q.push(v);
a[v] = cnt;
}
}
}
++ cnt;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
init();
scanf("%d%s", &n, s);
int id = 0;
for(int i = 1; i <= n; ++ i)
for(int j = i; j <= n; ++ j)
{
if(s[id] == '+')
{
g[i-1][j] = true;
in[j] ++;
}
else if(s[id] == '-')
{
g[j][i-1] = true;
in[i-1] ++;
}
++ id;
}
topo();
// for(int i = 0; i <= n; ++ i)
// printf("%d ", a[i]);
// puts("");
for(int i = 1; i < n; ++ i)
printf("%d ", a[i]-a[i-1]);
printf("%d\n", a[n]-a[n-1]);
}
return 0;
}