pku 3275

作者在 2007-12-19 16:49:09 发布以下内容

题目的意思是现在我知道一定量的序列,那么我要把这个序列排成一个升序还需要多少个比较关系。

这题目的主要想法就是不能顺着题意去做,如果你去建一棵树的话,基本就没办法下手。

主要的方法:

              现在已经知道了已有多少种的比较关系;(如果1>2,2>3,那么1>3这样就有了三种关系1与2,2与3,1与3)

             剩下的事情就是要知道还差多少种的关系;

 

源代码:

 

Problem: 3275 User: keloy
Memory: 4072K Time: 247MS
Language: C++ Result: Accepted

  • Source Code
    #include <iostream>
    using namespace std;
    int const maxn=1001;
    int from[maxn][maxn];
    int fp[maxn];
    bool inS[maxn];
    int seach(int num)
    {
    	int count=0;
    	if(fp[num]==0) return 0;
    	else{
    		inS[num]=1;
    	for(int i=0;i<fp[num];i++)
    	{
    		if(inS[from[num][i]]==0)
    		{
    		  inS[from[num][i]]=1;
    	      count+=seach(from[num][i])+1;
    		}
    	}
    	return count;
    	}
    }
    main()
    {
    	int N,M;
    	long int sum=0;
        cin >>N>>M;
        for(int i=0;i<=N;i++)
    	{
    		fp[i]=0;
    	}
    	for(i=0;i<M;i++)
    	{
    		int a,b;
    		cin >>a>>b;
    		from[a][fp[a]++]=b;
    	}
    	for(int j=1;j<=N;j++)
    	{
    		memset(inS,0,maxn);
    		sum+=seach(j);
    	}
    	cout <<(N*(N-1)/2)-sum<<endl;
    	return 0;
    }
这个题目还可以优化,我比较的懒就没做,不好意思哈
acm | 阅读 1990 次
文章评论,共0条
游客请输入验证码
浏览260756次