USACO2.3 控制公司 Controlling Companies 题解【洛谷P1475】

目录

题目分析

原题

思路

代码分段讲解

头文件和定义变量

主函数

输入

调用搜索

DFS函数

你们最爱的完整代码

广告


参考了洛谷一位大神的题解,本蒟蒻就用自己写的代码讲讲思路吧。

题目分析

原题

思路

本体数据比较“水”,据说用DFS可以直接解决。直接输入,存储股票,记录公司个数,然后枚举每个公司是否能控制其他公司(双重循环)。

代码分段讲解

头文件和定义变量

#include<bits/stdc++.h>//直接上万能头
#define f(c,N) for(int c=1;c<=N;c++)//本蒟蒻很懒
int n,x,y,k,cnt,stock[205],a[205][205];//stock数组记录被控股票,a数组记录占有股票数
bool vis[205];//dfs时标记是否有访问【其实定义成int也行,只是我想省空间】

因为程序过程中存在很多循环,所以我很懒为了方便,我定义了一个宏,将循环简化。其他变量名的意义见注释。

主函数

因为DFS过程涉及主函数里的输入,为了理清思路,咱先来讲主函数。【int main和return大家都会写吧,因为我要分段讲,为了美观,我就不写了】【完整代码是完整的😜】

输入

循环记录每个公司拥有的股份,不断更新cnt到最大编号的公司以便一会儿的搜索。

    scanf("%d",&n);
	f(i,n){//刚刚定义的宏派上用场了
		scanf("%d%d%d",&x,&y,&k);//x公司拥有y公司k%的股份
		//更新cnt的值到最大编号的公司 
		if(x>cnt)
			cnt=x;
		if(y>cnt)
			cnt=y;
		a[x][y]+=k;//记录 
	}

调用搜索

开始枚举每个公司。先初始化数组然后算出当前公司旗下所有公司的股票百分比总和,最后循环,判断,输出。

f(i,cnt){//搜索每个公司 
    //每次都初始化数组
	memset(vis,0,sizeof(vis));
	memset(stock,0,sizeof(stock));
	dfs(i);//从自己开始搜,搜完后已经把所有旗下公司的股票算出来了 
	f(j,cnt)
		if(stock[j]>50&&i!=j)//不能自己控制自己。股票如果够了,则这个公司被控制 
			printf("%d %d\n",i,j);
}

DFS函数

在我这个蒟蒻眼里,这应该就是个普普通通的DFS吧(比普通的更普通)。肯定难不倒各位大神。

标记访问过,循环计算当前公司被拥有的股票数。

void dfs(int now){
	vis[now]=1;//访问过
	f(i,cnt){
		stock[i]+=a[now][i];//加上now公司拥有i的股权[反向求解,直接求每个公司被控制的股票数]
		if(stock[i]>50)
			if(!vis[i])
				dfs(i);
	} 
	return;
}

你们最爱的完整代码

完整代码如下(带注释的哦~):

#include<bits/stdc++.h>
#define f(c,N) for(int c=1;c<=N;c++)
int n,x,y,k,cnt,stock[205],a[205][205];
bool vis[205];
void dfs(int now){
	vis[now]=1;//访问过
	f(i,cnt){
		stock[i]+=a[now][i];//加上now公司拥有i的股权[反向求解,直接求每个公司被控制的股票数]
		if(stock[i]>50)
			if(!vis[i])
				dfs(i);
	} 
	return;
}
int main(){
	scanf("%d",&n);
	f(i,n){
		scanf("%d%d%d",&x,&y,&k);//x公司拥有y公司k%的股份
		//更新cnt的值到最大编号的公司 
		if(x>cnt)
			cnt=x;
		if(y>cnt)
			cnt=y;
		a[x][y]+=k;//记录 
	}
	f(i,cnt){//搜索每个公司 
		memset(vis,0,sizeof(vis));
		memset(stock,0,sizeof(stock));
		dfs(i);//从自己开始搜,搜完后已经把所有旗下公司的股票算出来了 
		f(j,cnt)
			if(stock[j]>50&&i!=j)//不能自己控制自己,股票如果够了,则会被控制 
				printf("%d %d\n",i,j);
	}
	return 0;
} 

广告

宣传一下我自己用C++写的一个无聊、没用的电脑程序,安装包下载链接(绝对安全)如下。

下载链接1-蓝奏云-密码8888 下载链接2-我同学制作的网站 宣传一下我同学制作的网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值