/* 利用前缀和的思想进行转化,每个符号可以得出一个不等关系,利用前缀和将其转化为二元关系,
然后一个二元组为一条有向边,进行拓扑排序,按拓扑的顺序进行赋值。*/
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
bool map[11][11];
int in[11],ans[11];
bool vis[11];
int n;
void topsort()
{
queue <int> q;
for(int i=0; i<=n; i++)
if(in[i]==0) q.push(i);
int num=0;
while(!q.empty())
{
int u=q.front();
q.pop();
num++;
for(int i=0; i<=n; i++)
{
if(map[u][i])
{
in[i]--;
if(in[i]==0)
{
q.push(i);
ans[i]=num;
}
}
}
}
}
int main()
{
//freopen("a.txt","r",stdin);
int t;
scanf("%d",&t);
char s[100];
while(t--)
{
scanf("%d",&n);
scanf(" %s",s);
memset(map,false,sizeof(map));
memset(in,0,sizeof(in));
memset(ans,0,sizeof(ans));
int h=0;
for(int i=1; i<=n; i++)
for(int j=i; j<=n; j++)
{
if(s[h]=='+') map[i-1][j]=true,in[j]++;
else if(s[h]=='-') map[j][i-1]=true,in[i-1]++;
h++;
}
topsort();
for(int i=1; i<n; i++)
printf("%d ",ans[i]-ans[i-1]);
printf("%d\n",ans[n]-ans[n-1]);
}
return 0;
}

本文介绍了一种利用前缀和思想结合拓扑排序解决符号关系问题的方法。通过将符号转换为二元关系,并构造有向图,进而利用拓扑排序确定变量间的相对顺序。适用于处理具有依赖关系的数据集。

371

被折叠的 条评论
为什么被折叠?



