zoukankan      html  css  js  c++  java
  • poj 3687(拓扑排序)

    题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签。如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的前面比后的要请,而且这n个球的重量也正好是分布在1-n这个范围内,现在要你求出他们各自所占的重量。

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    
    const int MAX_N = 210;
    
    int dig[MAX_N];
    int judge[MAX_N][MAX_N];
    int loc[MAX_N];
    int m,n;
    
    priority_queue<int> s;
    
    int topsort()
    {
    	int num=n;
    	for(int i=1;i<=n;i++)
    		if(!dig[i])	s.push(i);
    	if(s.empty())	return 0;
    	while(!s.empty())
    	{
    		int tmp=s.top(); s.pop();
    		loc[tmp]=num--;
    		for(int i=1;i<=n;i++)
    		{
    			if(judge[i][tmp])
    			{
    				judge[i][tmp]=0;
    				dig[i]--;
    				if(!dig[i])	s.push(i);
    			}
    		}
    	}
    	if(num!=0)	return 0;
    	return 1;
    }
    
    int main(void)
    {
    	int t,a,b;
    	scanf("%d",&t);
    	while(t--)
    	{
    		memset(dig,0,sizeof(dig));
    		memset( judge,0,sizeof( judge));
            memset( loc,0,sizeof(loc));
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=m;i++)
    		{
    			scanf("%d%d",&a,&b);
    			if(judge[a][b]>0)	continue;
    			judge[a][b]=1;
    			dig[a]++;
    		}
    		a=topsort();
    
    		if(a)
    		{
    			int i=1;
    			for( ; i < n ; printf("%d ",loc[ i++ ]) );
                printf("%d
    ",loc[ i ]);
    		}
    		else
    		{
    			printf("-1
    ");
    		}
    		
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    郑码
    AutoCAD 安装
    China Mobile 移动
    CCB 建行
    Word基础
    Java 继承
    Java 封装(内部类)
    Java 类与对象
    Java 方法
    Java 数组
  • 原文地址:https://www.cnblogs.com/jaszzz/p/12885031.html
Copyright © 2011-2022 走看看