UVa Live4255

原创 2016年08月28日 20:05:39

第一个有关拓扑排序的题目,光看题目很难想到这题是拿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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

uva La 4255 Guess (拓扑排列)

uva La 4255 Guess (拓扑排列) 拓扑排列适用于DAG有向无环图。 构造所有节点之间的单向边。 具体问题中,抽象出点和边(单向边),单向边对应于具体的点之间的大小关系或需求关。 ...

Evil Straw Warts Live (Uva10716 回文串+贪心)

题意:判断一个串能否通过临近的两个字符多次交换变成回文串,不能输出“Impossible”,能的话输出最少的交换次数。 思路:预处理每个字母出现的次数,若有>=2个字母出现的次数是奇数则不可能。然后从...

UVa:10716 Evil Straw Warts Live

如果出现奇数次的字母个数大于1那说明不能形成回文。 然后按照回文字母一半在左一半在右的原则构造一个回文串,然后用原串依次交换每个字母最后得到回文串的交换次数就是答案。 因为越界RE了3次。。  ...

uva live 4394 String painter 区间dp

// uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下觉得只是略微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现样例过了,然而自己给...

UVA live2326

题目的意思就是搬桌子,从一个fangjian

UVA-10716 Evil Straw Warts Live(贪心+模拟)

题意:给定一些字符串,要求出能否通过交换相邻的字母变换为回文。如果可以输出最少变换次数。 解析:贪心 1、首先要预判一下是否可以构成回文串,如果字符串中没有或只有1个字母是奇数。就可以组成。剩...

UVA 10716 Evil Straw Warts Live

Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when reversed. Giv...

UVa Live Archive 2519 - Radar Installation

传送门UVa Live Archive 2519 - Radar Installation 题意:找出最小的雷达数。

uva live 3516 Exploring Pyramids 区间DP

// uva live 3516 Exploring Pyramids 区间DP // // 题目大意: // // 给你一个多叉树,每个节点是一个大写字母,从根节点走,按照先序遍历的 // 原则访...

UVa live6492Welcome Party(二分最大匹配之最小点覆盖)

题目地址:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)