山上的国度(图论相关)

山上的国度

P1394
题目描述

有一个神秘的小国坐落在南方的青山之上,只有当黄昏时,落日耀眼的余晖刺破薄雾的遮拦,有机缘者才可看到小山上面的n个美丽的村庄。

传说这个古老的国家里有m条枢纽管道,每一条苍老的管道连接着两个村庄,千百年来为村民提供水源的流通。

n个村庄里只有一个水库,从有水库的村庄通过这些枢纽管道向其它村庄提供水源。大家都明白水往低处流,所有村庄都能得到水库的供水。

黄小明就是那个有机缘者,同时他也是个偏执狂(把小猫绑在一起的那个变态小明),他迫切的想要知道水库应该在哪一个村庄,你能帮他解决疑惑吗?

输入输出格式

输入格式:
第一行输入n,m<=300。第二行输入n个正整数,第i个数表示第i个村庄的海拔。之后m行每行两个数表示这两个村庄之间有一条道路。(同海拔之间不能相互流水)

输出格式:
若存在这样的村庄,输出两行:

第一行为“Oui, j’ai trouve la solution.”。

第二行为村庄的编号。

若不行,请输出“Non”(不包括引号,可参见样例)

输入输出样例

输入样例#1:
4 2
1 2 3 4
1 2
3 4
输出样例#1:
Non

思路

这个题比较自然的思想就是,我们将管道两端高度更高的一边作为出发点,另一个就是到达点,那么到达点的入度+1。入度如果不是0,那么就说明它没有来源,反之有来源,那么它必须有水源,而水源只有一个,所以这张图的所有点来源入度为0的只有1个的时候才有解,然后输出入度为0的那个点,反之无解。
不过Luogu上面数据#18有错误,无伤大雅。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int i,j,n,m,temp;
int p[301],v[301],rd[301],hd[301];
int b[301];
struct data
{
    int v,nxt;
}a[601];

int r()
{
    int ans=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        ans*=10;
        ans+=ch-'0';
        ch=getchar();
    }
    return ans*f;
}
int ans;

void add(int x,int y)
{
    a[++temp].v=y;
    a[temp].nxt=hd[x];
    hd[x]=temp;
}

int main()
{
//  freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
    n=r();m=r();
    for(i=1;i<=n;i++)
    {
        v[i]=r();
    }
    int xx,yy,num=n;
    for(i=1;i<=m;i++)
    {
        xx=r(),yy=r();
        if(v[xx]>v[yy])
        {
            if(!rd[yy])
            num--;
            rd[yy]++;
            b[yy]=1;
        }
        else if(v[xx]<v[yy])
        {
            if(!rd[xx])
            num--;
            rd[xx]++;
            b[xx]=1;
        }
    }

    if(num==1)
    {
        for(i=1;i<=n;i++)
        {
            if(!b[i])
            cout<<"Oui, j'ai trouve la solution."<<endl<<i;
        }
    }

    else
    cout<<"Non";
    return 0;
}
/*min(f[j],f[i-1][j-k*p[i]]+c[i]*k);
4 3
1 2 3 4
1 2
2 3
3 4
*/

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梦幻国度是一款非常受欢迎的手游,它拥有丰富的剧情、精美的画面和刺激的玩法。下面是一些攻略和技巧,可以帮助你在游戏中更好地发挥。 1. 熟悉剧情和任务系统:梦幻国度的剧情非常丰富,玩家需要通过完成不同的任务来推动剧情的发展。在游戏中,你需要完成各种任务,如打怪、收集物品、解谜等,这些任务都有一定的难度和奖励。熟悉任务系统可以让你更好地规划游戏进度。 2. 提升等级和装备:升级和装备是游戏中非常重要的元素,它们可以让你的角色更加强大。游戏中有很多不同的装备和道具,你需要不断地打怪、完成任务和收集资源来获取更好的装备和道具。同,你也需要不断地提升自己的等级,才能使用更高级的装备和技能。 3. 组队和社交互动:梦幻国度一个多人在线游戏,你可以和其他玩家组队一起冒险。组队可以让你更好地完成任务和打怪,同也可以认识更多的朋友。在游戏中还有很多社交互动,如社区、排行榜、结婚等,可以让你更好地融入游戏世界。 4. 熟悉技能和战斗模式:游戏中有很多不同的技能和战斗模式,你需要熟悉它们才能更好地打怪和完成任务。不同的技能适用于不同的场景和敌人,你需要根据实际情况选择合适的技能。同,你也需要掌握不同的战斗模式,如近战、远程等,才能更好地应对各种敌人。 5. 活动和福利:游戏中还有很多不同的活动和福利,你需要及参加和领取。这些活动可以让你获得更多的奖励和经验,提升自己的等级和装备。同,还有很多限福利和特价商店,可以让你以更优惠的价格购买道具和装备。 以上是梦幻国度手游的一些攻略和技巧,希望对你有所帮助。祝你在游戏中取得更好的成绩!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值