关闭

UVa Live4255

42人阅读 评论(0) 收藏 举报
分类:

第一个有关拓扑排序的题目,光看题目很难想到这题是拿topo来做的。看了白书上的分析才知道拿topo来做,并且也用到了常用的连续和转化为前缀和之差的思想,然后奖前缀和标号作为图的结点利用大小+-来进行连接即可。然后由得大小关系的原因所建成的图,所以 每一层的topo得到可以入队列的入度为0的结点的时候,都可以将该结点进行赋值,然后最外层的肯定是最大值,每一层减一即可。这样做的话就不需要再让pre[0]=0了,因为0也是图内 的结点,也会得到一个确定的f值,然后就可以得到每个值了。一开始自己写的,写了一堆乱糟糟的虽然过样例还是WA的渣代码,参考这篇博文

http://blog.csdn.net/houserabbit/article/details/38929571   点击打开链接

#include<cstdio>
#include<cstring>
#include<algorithm>


using namespace std;

int t,n;
char m[15][15];
int a[15],pre[20];

struct Edge
{
    int v,nexts;
}edge[60];
int head[20],indegree[20],vis[20];
int cnt,q[20],num;

void add_edge(int u,int v)
{
    Edge p;
    p.v=v;
    p.nexts=head[u];
    edge[cnt]=p;
    head[u]=cnt++;
}

void topsort()
{
    int f=10;
    num=0;
    for(int i=0;i<=n;i++)
    {
        if(!indegree[i])
        {
            q[num++]=i;
            pre[i]=f;
        }
    }
    f--;
     for(int i=0;i<num;i++)
     {
          vis[q[i]]=1;
         for(int k=head[q[i]];k!=-1;k=edge[k].nexts)
         {
             if(!vis[edge[k].v])
            indegree[edge[k].v]--;
            if(!indegree[edge[k].v])
            {
                q[num++]=edge[k].v;
                pre[edge[k].v]=f;
            }
         }
         f--;
     }
}

void init()
{
         int k=0;
    char s[60];
       scanf("%d",&n);
       scanf("%s",s);

    for(int i=1;i<=n;i++)
       {
           for(int j=i;j<=n;j++)
           {
               m[i][j]=s[k++];
               if(m[i][j]=='+')
               {
                   indegree[i-1]++;
                   add_edge(j,i-1);
               }
               else if(m[i][j]=='-')
               {
                   indegree[j]++;
                   add_edge(i-1,j);
               }
          }
    }

}


int main()
{
   scanf("%d",&t);
   while(t--)
   {
       cnt=0;
       memset(head,-1,sizeof(head));
    memset(indegree,0,sizeof(indegree));
    memset(vis,0,sizeof(vis));
         init();
        topsort();
   for(int i=1;i<=n;i++)
   {
       printf("%d%s",pre[i]-pre[i-1],(i==n)?"\n":" ");
   }
}
  return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8207次
    • 积分:1051
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:25篇
    • 译文:0篇
    • 评论:4条
    最新评论
  • HDU 1536 S-Nim

    qq_23702679: http://www.cnblogs.com/kuangbin/archive/2011/08/28...

  • HDU 1114

    qq_23702679: 还有就是这个是完全背包里求最小价值的,有那么一点点不同于背包九讲里的做法,这个还是可以好好想下的,首...

  • HDU 1114

    qq_23702679: 还有就是这个是完全背包里求最小价值的,有那么一点点不同于背包九讲里的做法,这个还是可以好好想下的,首...

  • HDU 2612

    qq_23702679: 特别最后忘记了判断了YM都是可以共同达到改点@这个要求,造成了我很多的错误。