zoukankan      html  css  js  c++  java
  • poj3687 拓扑排序 还没怎么搞明白 回头再想想

    【题意】:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况。

    【思路】:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋)。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 #include<map>
     7 #include<queue>
     8 #include<stack>
     9 #include<set>
    10 #include<cmath>
    11 #include<vector>
    12 #define inf 0x3f3f3f3f
    13 #define Inf 0x3FFFFFFFFFFFFFFFLL
    14 #define eps 1e-9
    15 #define pi acos(-1.0)
    16 using namespace std;
    17 
    18 int in[202],ans[202];
    19 bool g[202][202],vis[202];
    20 priority_queue<int>q;
    21 
    22 int main()
    23 {
    24     int i,t,j,n,m,a,b;
    25     scanf("%d",&t);
    26     while(t--)
    27     {
    28        //getchar();
    29         scanf("%d%d",&n,&m);
    30         memset(in,0,sizeof(in));
    31         memset(g,false,sizeof(g));
    32         memset(vis,false,sizeof(vis));
    33         while(m--)
    34         {
    35             scanf("%d%d",&a,&b);
    36             if(g[b][a])
    37                 continue;
    38             g[b][a]=true;
    39             in[a]++;
    40         }
    41         for(i=1;i<=n;i++)
    42             if(in[i]==0)
    43                 {
    44                     q.push(i);
    45                     vis[i]=true;
    46                 }
    47         int num=n;
    48         for(i=0;i<n;i++)//每次一个出度为0的序号最小的 
    49         {
    50             int temp;
    51             if(q.empty())
    52                 break;
    53             temp=q.top();q.pop(); //printf("i  %d 
    ",temp);
    54             ans[temp]=num--;
    55             for(int j=1;j<=n;j++)
    56                 if(j!=temp&&g[temp][j])
    57                 {
    58                     in[j]--;
    59                     if(in[j]==0&&!vis[j])
    60                        {
    61                            q.push(j);
    62                            vis[j]=true;
    63                        }
    64                 }
    66         }
    67         //printf("ans    ");
    68         if(i<n)
    69             printf("-1
    ");
    70         else
    71         {
    72             printf("%d",ans[1]);
    73             for(i=2;i<=n;i++)
    74                 printf(" %d",ans[i]);
    75             printf("
    ");
    76         }
    77     }
    78 
    79 }

    考虑这组数据:

    2
    
    5 4
    1 4
    4 2
    5 3
    3 2
    
    5 3
    1 4
    4 2
    3 5
    
    输出应该是:
    1 5 3 4 2
    1 3 4 2 5
  • 相关阅读:
    Nginx的安装与部署
    什么是Nginx?为什么使用Nginx?
    spark 中的RDD编程 -以下基于Java api
    java反射
    POST-GET请求
    Spring Boot 专栏
    【Shiro】Apache Shiro架构之身份认证(Authentication)
    maven项目如何启动运行---发布到tomcat中
    一位资深程序员大牛给予Java初学者的学习路线建议
    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
  • 原文地址:https://www.cnblogs.com/assult/p/3895050.html
Copyright © 2011-2022 走看看