NOI 2001 食物链 并查集A的第一题。

本文介绍了一种通过算法处理动物间形成的三角捕食关系的方法。该算法使用了并查集思想,通过设置源头节点简化了关系判断过程,避免了矛盾出现。文章详细展示了算法实现流程及关键步骤。

  这题确定的是1 ~ N 动物的三角捕食关系。

  因为可能存在多个三角圈。所以在设置的时候用find这个函数来确定三角的源头。

  就比如说 a , b ,c ,d ,e ,f , g 他们在不同的三角捕食关系中,但是他们是在总三角关系的同一个等级中。那么我们把p[b] = a , p[c] = a , ... 让他们的源头都指向a,这样每次比较都是用源头a来进行,就不会忽略已有的情况或者发生矛盾了。

#include<cstdio>
#define lie {cnt++;continue;}
#define rise(i,a,b) for(int i=a;i<=b;i++)
const int MAXN = 100000 * 3 + 1; 
int p[MAXN], fa[MAXN];
void pre( int n )
/* to make original Triangle predator-prey relationships. && the sourse of every number. */
{
	rise( i , 1 , 3 * n ) p[i] = i;
	rise( i , 1 , n )
	{
		fa[i] = i + n;
		fa[ i + n ] = i + n + n;
		fa[ i + n + n ] = i; 
	}
}
int find( int x )
/*  to find the source of x, such as if a <=> b , b <=> c , c <=> d , ... , ( a , b , c , d ... are in the same level ) we use a to represent b , c , d ... */
{
    if( x != p[x] ) p[x] = find( p[x] );
    return p[x];
}
int doit( int k , int n )
{
	int cnt = 0, w, x, y;
	rise( i , 1 , n )
	{
	    scanf( "%d%d%d" , &w, &x, &y );
	    if( x > k || y > k ) lie;
	    int a[3], b[3];
	    /* a[i] is the Triangle predator-prey relationships of a[0]. */
        a[0] = find(x)  ; b[0] = find(y)  ;
        a[1] = fa[a[0]] ; b[1] = fa[b[0]] ;
        a[2] = fa[a[1]] ; b[2] = fa[b[1]] ;
        bool flag = false;
        rise( i , 0 , 2 )
        if( a[0] == b[i] )
        {
        	flag = true;
        	break;
        }
        /* if flag == true , it means x , y has some relationship.*/
        if( w == 1 )/* if x , y in the same level. */ 
        {
        	if( flag && a[0] != b[0] ) lie;
        	if( !flag )
        	rise( i , 0 , 2 )
        	p[ b[i] ] = a[i];
        	/* make a[i] the sourse of b[i]. */
        }
        else if( w == 2 )
        {
        	if( x == y ) lie;
        	if( !flag )
        	rise( i , 0 , 2 )
        	p[ b[i] ] = a[ ( i + 2 ) % 3 ];
            else 
            {
            	if( fa[ b[0] ] != a[0] ) lie;
            }
        }
	}
	return cnt;
}
int main()
{
	int n, k, cnt = 0, type = 0;
	scanf( "%d%d", &k, &n );
    pre( n );
 	printf( "%d\n" , doit( k , n ) );
	return 0;
}


多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的多源动态最优潮流的分布鲁棒优化方法,适用于IEEE118节点电力系统。该方法结合两阶段鲁棒模型与确定性模型,旨在应对电力系统中多源输入(如可再生能源)的不确定性,提升系统运行的安全性与经济性。文中详细阐述了分布鲁棒优化的建模思路,包括不确定性集合的构建、目标函数的设计以及约束条件的处理,并通过Matlab编程实现算法求解,提供了完整的仿真流程与结果分析。此外,文档还列举了大量相关电力系统优化研究案例,涵盖微电网调度、电动汽车集群并网、需求响应、储能配置等多个方向,展示了其在实际工程中的广泛应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程师。; 使用场景及目标:①用于研究高比例可再生能源接入背景下电力系统的动态最优潮流问;②支撑科研工作中对分布鲁棒优化模型的复现与改进;③为电力系统调度、规划及运行决策提供理论支持与仿真工具。; 阅读建议:建议读者结合提供的Matlab代码与IEEE118节点系统参数进行实操演练,深入理解分布鲁棒优化的建模逻辑与求解过程,同时可参考文中提及的其他优化案例拓展研究思路。
引用食物链的。这段代码使用了并查集算法来判断两个动物是否在同一个食物链上,并计算满足要求的食物链的数量。 食物链是什么? 回答: [NOI2001 食物链是一个关于动物之间食物关系的问。根据给出的描述,动物王国中有三类动物A, B, C,它们之间形成了一个环形的食物链,其中A吃B,B吃C,C吃A。问要求我们计算满足要求的食物链的数量。这个问可以使用并查集算法进行解决,通过判断两个动物是否在同一个食物链上来计算满足要求的食物链的数量。 [2<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[NOI2001] 食物链](https://blog.youkuaiyun.com/qq_43219250/article/details/126453235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [[NOI2001]食物链](https://blog.youkuaiyun.com/aoniebu42564/article/details/102140448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值