目录
序
参考了洛谷一位大神的题解,本蒟蒻就用自己写的代码讲讲思路吧。
题目分析
原题
思路
本体数据比较“水”,据说用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++写的一个无聊、没用的电脑程序,安装包下载链接(绝对安全)如下。