uva 1423(拓补排序)

额。。。。。突然想起来,这两天忘了写博客了。。。。。这题就是拖布排序,维护连续n个数字的和sum,越晚拿出来的sum越大,晚拿出来减早拿出来的就是‘+’了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn=20;
int sum[maxn],c[maxn];
int t,n;
string aa;
vector<int> bb[maxn];
void addage(int x,int y)
{
    c[y]++;
    bb[x].push_back(y);
}
void mmp()
{
    int b=0;
    queue<int> q;
   for(int i=0;i<=n;i++)
      if(!c[i]) q.push(i);
     while(q.size())
     {
         int md=q.size();
         for(int i=0;i<md;i++)
         {
             int mm=q.front();
             q.pop();
            sum[mm]=b;
           for(int j=0;j<bb[mm].size();j++)
           {
               int mmm=bb[mm][j];
               c[mmm]--;
               if(c[mmm]==0)
                q.push(mmm);
           }
         }
         b++;
     }
}
void init()
{
     memset(c,0,sizeof(c));
     for(int i=0;i<=n;i++)
        bb[i].clear();
        memset(sum,0,sizeof(sum));
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        init();
        scanf("%d",&n);
         cin >> aa;
         int nn=0;
          for(int i=0;i<=n;i++)
           for(int j=i+1;j<=n;j++)
           {
               if(aa[nn]=='+')
                 addage(i,j);
              else if(aa[nn]=='-')
                 addage(j,i);
              nn++;
           }
        mmp();
      for(int i=1;i<=n;i++)
      {
          printf("%d",sum[i]-sum[i-1]);
          if(i!=n) printf(" ");
          else printf("\n");
      }

    }
    return 0;
}

 

posted on 2017-08-22 21:10  发牌员  阅读(140)  评论(0)    收藏  举报

导航