zoukankan      html  css  js  c++  java
  • [poj3687]Labeling Balls_拓扑排序

    Labeling Balls poj-3687

        题目大意:给出一些球之间的大小关系,求在满足这样的关系下,编号小的尽量比编号大的球的方案。

        注释:1<=N(球的个数)<=200,1<=M(题目给出的关系数)<=40000.

          想法:和poj1094几乎相同,只不过我们需要在编号上做一些手脚。其实就是从重者想轻者连边即可。然后我们用数组循环实现toposort,方便我们判环。挺细节的一道题。

        最后,附上丑陋的代码... ...

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cmath>
    #define M 210
    using namespace std;
    int in[M],map[M][M],ans[M],flag;
    void topsort(int n)
    {
    	int k=n;
    	while(k>=1)
    	{
    		int mid=0;
    		for(int i=n;i>=1;i--)
    		{
    			if(in[i]==0)
    			{
    				for(int j=1;j<=n;j++)
    					if(map[i][j]==1)  
    						in[j]--;
    				in[i]--;
    				ans[i]=k--;
    				mid=i;
    				break;
    			}
    		}	
    		if(mid==0)
    		{
    			flag=0;
    			break;
    		}
    	}
    }
    void original()
    {
    	memset(map,0,sizeof map);
    	memset(in,0,sizeof in);
    	flag=1;
    }
    int main()
    {
    	int cases,n,m,a,b;
    	cin>>cases;
    	while(cases--)
    	{
    		original();
    		scanf("%d%d",&n,&m);
    		for(int i=0;i<m;i++)
    		{
    			scanf("%d%d",&a,&b);
    			if(a!=b)
    			{
    				if(map[b][a]==0)
    				{
    					map[b][a]=1;
    					in[a]++;
    				}
    			}
    			else flag=0;
    		}
    		if(flag)
    		{
    			topsort(n);
    			if(flag==0)
    			{
    				printf("-1
    ");continue;
    			}
    			
    			for(int i=1;i<=n;i++)
    				printf("%d ",ans[i]);
    			cout<<endl;
    		}
    		else printf("-1
    ");
    	}
    }
    

         小结:OI的路还有很长,toposort裸题就先告一段落。因为植物大战僵尸而学习的新知识点,蛮有意思的。

  • 相关阅读:
    codeforces 659F F. Polycarp and Hay(并查集+bfs)
    codeforces 659B B. Qualifying Contest(水题+sort)
    codeforces 659E E. New Reform(图论)
    codeforces 659D D. Bicycle Race(水题)
    sql_mode值的含义
    MySQL Query Cache
    Orchestrator安装
    脚本VIP更改为keepalive
    MHA软件下载地址
    MySQL中的事件调度器EVENT
  • 原文地址:https://www.cnblogs.com/ShuraK/p/8611542.html
Copyright © 2011-2022 走看看