• poj3687(Labeling Balls)


    题目大意:

        给你N个球的重量比较,输出1->N位置球的重量(记住是球的重量,不是按照球重量大小输出序号,球的重量大小也是1->n)。如果无法判断输出-1.

    解题思路:

        拓扑排序,记录较小的编号球的入度,依次n--赋值入度为零的编号球。

    代码:

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <sstream>
      4 #include <cstdlib>
      5 #include <cstring>
      6 #include <cstdio>
      7 #include <string>
      8 #include <bitset>
      9 #include <vector>
     10 #include <queue>
     11 #include <stack>
     12 #include <cmath>
     13 #include <list>
     14 //#include <map>
     15 #include <set>
     16 using namespace std;
     17 /***************************************/
     18 #define ll long long
     19 #define int64 __int64
     20 /***************************************/
     21 const int INF = 0x7f7f7f7f;
     22 const double eps = 1e-8;
     23 const double PIE=acos(-1.0);
     24 const int d1x[]= {0,-1,0,1};
     25 const int d1y[]= {-1,0,1,0};
     26 const int d2x[]= {0,-1,0,1};
     27 const int d2y[]= {1,0,-1,0};
     28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
     29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
     30 /***************************************/
     31 void openfile()
     32 {
     33     freopen("data.in","rb",stdin);
     34     freopen("data.out","wb",stdout);
     35 }
     36 /**********************华丽丽的分割线,以上为模板部分*****************/
     37 int cnt1[205],cnt2[205];
     38 int topol[205];
     39 int adj[205][205],adi[205][205];
     40 int dui[205],re[205];
     41 int topo(int n)
     42 {
     43     int i,j,k,d=0,z=-1,x,m;
     44     m=n;
     45     for(i=1; i<=n; i++)
     46         for(j=n; j>=1; j--)
     47         {
     48             if(cnt2[j]==0)
     49             {
     50                 cnt2[j]=-1;
     51                 re[j]=m--;
     52                 topol[d++]=j;
     53                 for(k=1; k<=n; k++)
     54                     if(adi[k][j])
     55                     {
     56                         adi[k][j]=0;
     57                         cnt2[k]--;
     58                     }
     59                 break;
     60             }
     61         }
     62     if (d!=n)
     63         return 0;
     64     for(j=1; j<=n; j++)
     65     {
     66         if(j!=n)
     67             printf("%d ",re[j]);
     68         else
     69             printf("%d
    ",re[j]);
     70     }
     71     return 1;
     72 }
     73 int main()
     74 {
     75     int cas;
     76     scanf("%d",&cas);
     77     while(cas--)
     78     {
     79         int i,a,b;
     80         int m,n,c=1;
     81         scanf("%d%d",&m,&n);
     82         memset(topol,0,sizeof(topol));
     83         memset(cnt1,0,sizeof(cnt1));
     84         memset(cnt2,0,sizeof(cnt2));
     85         memset(adj,0,sizeof(adj));
     86         memset(adi,0,sizeof(adi));
     87         while(n--)
     88         {
     89             scanf("%d%d",&a,&b);
     90             if (!adj[a][b])
     91             {
     92                 adj[a][b]=1;
     93                 adi[a][b]=1;
     94                 cnt1[b]++;
     95                 cnt2[a]++;
     96             }
     97         }
     98         c=topo(m);
     99         if (c==0)
    100             printf("-1
    ");
    101     }
    102     return 0;
    103 }
    View Code
    屌丝终有逆袭日,*******。
  • 相关阅读:
    java数据类型转换
    复习Java基础
    最完整的台达PLC培训教程(沈阳工大)学习笔记1
    6.3.4 方法引用
    6.3.3函数式接口
    6.3 lambda 表达式
    java 核心技术卷一笔记 6 .2.3 接口 lambda 表达式 内部类
    java 核心技术卷一笔记 6 .2接口 lambda 表达式 内部类
    java 核心技术卷一笔记 6 .1.接口 lambda 表达式 内部类
    软件开发需求风险分析
  • 原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3840097.html
Copyright © 2020-2023  润新知