uva 1423 - Guess (topsort,4级)

来源:互联网 发布:淘宝退货有次数限制吗 编辑:程序博客网 时间:2024/05/22 10:39

Given a sequence of integers, a1a2,..., an , we define its sign matrix S such that, for 1$ \le$i$ \le$j$ \le$n , Sij = `` + " if ai +...+ aj > 0 ; Sij = `` - " if ai +...+ aj < 0 ; and Sij = ``0" otherwise.

For example, if (a1a2a3a4) = (- 1, 5, - 4, 2) , then its sign matrix S is a 4×4 matrix:


 12341-+0+2 +++3  --4   +


We say that the sequence (-1, 5, -4, 2) generates the sign matrix. A sign matrix is valid if it can be generated by a sequence of integers.

Given a sequence of integers, it is easy to compute its sign matrix. This problem is about the opposite direction: Given a valid sign matrix, find a sequence of integers that generates the sign matrix. Note that two or more different sequences of integers can generate the same sign matrix. For example, the sequence (-2, 5, -3, 1) generates the same sign matrix as the sequence (-1,5, -4,2).

Write a program that, given a valid sign matrix, can find a sequence of integers that generates the sign matrix. You may assume that every integer in a sequence is between -10 and 10, both inclusive.

Input 

Your program is to read from standard input. The input consists of T test cases. The number of test cases Tis given in the first line of the input. Each test case consists of two lines. The first line contains an integer n (1$ \le$n$ \le$10) , where n is the length of a sequence of integers. The second line contains a string of n(n + 1)/2 characters such that the first n characters correspond to the first row of the sign matrix, the next n - 1 characters to the second row, ... , and the last character to the n -th row.

Output 

Your program is to write to standard output. For each test case, output exactly one line containing a sequence of n integers which generates the sign matrix. If more than one sequence generates the sign matrix, you may output any one of them. Every integer in the sequence must be between -10 and 10, both inclusive.

Sample Input 

3 4 -+0++++--+ 2 +++ 5 ++0+-+-+--+-+--

Sample Output 

-2 5 -3 1 3 4 1 2 -3 4 -5
思路:设f[i]=ans[0]+..+ans[i],那么上述的i行j列+,-,0关系就表示为f[j]>f[i-1],f[j]<f[i-1],f[j]==f[i-1];

来个拓扑排序,就好了,其中0比较讨厌,那就不管它,只要再拓扑排序时,将没有入度的点都置成一样的值,就一定满足了相等的情况。


 

#include<iostream>#include<cstring>#include<cstdio>#include<vector>using namespace std;const int mm=15;vector<int> g[mm];int id[mm],f[mm],ans[mm];int cas,n;void get(int n){ char c;  memset(g,0,sizeof(g));  memset(id,0,sizeof(id));  for(int i=1;i<=n;++i)    for(int j=i;j<=n;++j)  {    while(1)    { c=getchar();      if(c=='+'){g[j].push_back(i-1);++id[i-1];break;}      else if(c=='-'){g[i-1].push_back(j);++id[j];break;}      else if(c=='0'){/**g[j][i-1]=g[i-1][j]=2;*/break;}    }  }}void topsort(){  int top=-1,high=10;  for(int i=0;i<=n;++i)    if(!id[i])    id[i]=top,top=i;  for(int i=0;i<=n;++i)  { int kop=-1;    if(top==-1){return;}    while(top!=-1)    {      int num=top;top=id[top];f[num]=high;      int m=g[num].size();      for(int i=0;i<m;++i)      if(--id[g[num][i]]==0)      {       id[g[num][i]]=kop;kop=g[num][i];      }    }    top=kop;    high--;  }}int main(){  while(~scanf("%d",&cas))  {    while(cas--)    { scanf("%d",&n);      get(n);      topsort();      for(int i=1;i<=n;++i)        ans[i]=f[i]-f[i-1];      for(int i=1;i<=n;++i)        printf("%d%c",ans[i],i==n?'\n':' ');    }  }}





原创粉丝点击