zoukankan      html  css  js  c++  java
  • POJ 3292

    这题跪了一下午、、都不知道自己怎么错的、、先贴个正确的代码

    这题有坑、

    /*这题为什么如此之坑,搞acm的人脑回路好曲折,膜拜。
    有一堆小球,要求a小球要在b小球前面,最后要求输出的是x号小球的位置;
    正向建图是不对的,因为题目要求的是标号小的要尽量在前
    如果按照普通的拓扑排序的话,举个栗子,5个点 2条边,2在1前面,5在1前面
    那么3和4是自由点,按照普通的拓扑排序的话,结果是 2->3->4->5->1 但是题目要求的是结果是
    2->5->1->3->4  正向建图不对的原因是因为独立点,和1有关的点都满足条件,但是独立点总会把小的点挤到后面去
    而且正着建图反着找也不对,独立点会在后面,但是小的点也会在后面了
    但是如果反向建图的话,而且反着找,每次都把最大的放进去那些大的独立点就会在后面。总之就是很奇葩的一道题、、
    */
    #include <iostream>
    #include <math.h>
    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #include <vector>
    #include <functional>
    #include <algorithm>
    #include <math.h>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    int p[50000],vis[205],s[205][205],n,sk,sum[205],flag;
    
    void tuopu()
    {
        int l;
        memset(vis,0,sizeof(vis));
        sk=0;
        int cnt=n;
        priority_queue<int ,vector<int>,l<int> >q;
        for(int i=n;i>=1;i--)
        {
            flag=0;
            for(int j=n;j>=1;j--)
            {
                if(vis[j]==0&&p[j]==0)
                {
                    l=j;
                    flag=1;
                    sum[j]=cnt;
                    cnt--;
                    break;
                }
            }
            vis[l]=1;
            if(flag==0)
            {
                break;
            }
            for(int j=n;j>=1;j--)
            {
                if(vis[j]==0&&s[l][j]==1)
                {
                    p[j]--;
                }
            }
        }
        return ;
    }
    int main()
    {
        int T,m,a,b;
        scanf("%d",&T);
        while(T--)
        {
            sk=0;
            memset(p,0,sizeof(p));
            memset(s,0,sizeof(s));
            scanf("%d%d",&n,&m);
            while(m--)
            {
                scanf("%d%d",&a,&b);
                if(s[b][a]==0)
                {
                    s[b][a]=1;
                    p[a]++;
                }
            }
            tuopu();
            if(flag==0)
            {
                printf("-1
    ");
            }
            else
            {
                for(int i=1; i<=n; i++)
                {
                    printf("%d",sum[i]);
                    if(i!=n)
                    {
                        printf(" ");
                    }
                    else
                    {
                        printf("
    ");
                    }
                }
            }
    
        }
        return 0;
    }
  • 相关阅读:
    linux机器间建立信任关系
    Linux shell逐行读取文件的方法
    linux强制用户下线命令
    Linux用户都应该了解的命令行省时技巧
    常用Linux Shell命令组合
    利用TensorFlow object_detection API 训练自己的检测器
    逻辑回归的梯度下降计算
    Android内存优化(使用SparseArray和ArrayMap代替HashMap)
    卷积的三种模式:full、same、valid + 卷积输出size的计算
    关于转置卷积(反卷积)的理解
  • 原文地址:https://www.cnblogs.com/qioalu/p/5158760.html
Copyright © 2011-2022 走看看