7-9 谁是真正的首富 (25 分)

题目描述:

有n个富豪,他们聚在一起想要知道谁才是他们之中的最有钱的人,然而他们所有人都隐藏了家产,根据调查,你知道了m个富豪之间的的财富关系。现在你要根据已有的关系信息推理出这n个人之中谁才是真正的首富。

输入格式:
多组输入。每组第一行输入2个整数n,m(0<=m,n<=1000000),当n=m=0时结束输入。接下来m行,每行输入一个整数a(1<=a<=n),一个字符c,和一个整数b(1<=b<=n),表示编号为a的富豪与编号为b(a不等于b)的富豪的财富关系,关系只有两种:大于或是小于。保证输入关系无矛盾,如1>2,2>3,3>1这种情况是矛盾的。

输出

输出格式:
若能推理出谁是首富,则输出首富的编号,否则输出“no solution”(不含双引号)。

样例输入

输入样例:
在这里给出一组输入。例如:

3 2
1 > 3
2 > 3
3 2
1 > 2
2 > 3
输出样例:
在这里给出相应的输出。例如:

no solution
1

分析:

这个题呀,在打比赛的时候,真的是一脸懵。
后来, 学长说是拓扑排序。 顿时就懂了。
然后, 在看学长代码发现压根就可以不用拓扑排序。
直接判断是不是只有一个点的入度为0就好了。
AC代码:

#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
int dp[1000001]= {0};
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            break;
        memset(dp,0,sizeof(dp));
        for(int i=0; i<m; i++)
        {
            int a,b;
            char c;
            scanf("%d %c %d",&a,&c,&b);
            if(c=='>')
                dp[b]++;
            else
                dp[a]++;
        }
        int cnt=0;
        int mark=0;
        for(int i=1; i<=n; i++)
        {
            if(dp[i]==0)
            {
                cnt++;
                if(mark==0)
                    mark=i;
            }
        }
        if(cnt==1)
            printf("%d\n",mark);
        else
            printf("no solution\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值