uva 1423 Guess

/* 利用前缀和的思想进行转化,每个符号可以得出一个不等关系,利用前缀和将其转化为二元关系,

然后一个二元组为一条有向边,进行拓扑排序,按拓扑的顺序进行赋值。*/

#include 
#include 
#include 
#include 
#include 
using namespace std;
bool map[11][11];
int in[11],ans[11];
bool vis[11];
int n;
void topsort()
{
    queue  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


你可能感兴趣的:(ACM,图论,LRJ白书)