USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
有至多100个公司,每个公司可能会有很多子公司,请你输出每个公司有哪些子公司。
B是A的子公司,有以下两种情况:
1. A拥有B超过50%的股份
2. A某些子公司(包括A自己)各拥有的B的股份加起来,超过50%
【输入格式】
第一行n,表示有n个股份关系。
有n行,每行给出三个数u,v,c,表示u公司拥有v公司c%的股份。
【输出格式】
每一行(u,v)表示v是u的子公司。
输出所有的(u,v),保证u升序,然后再保证v升序。
【输入样例】
3
1 2 80
2 3 80
3 1 20
【输出样例】
1 2
1 3
2 3
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
建个图,在里面用SPFA(Bellman-Ford)的思路来求解。不了解SPFA的同学,可以去看我之前的文章:“《算法》C++代码 SPFA”。
把所有公司建成一个图,u拥有v股份c,就连一条边(u,v)=c。
我们依次判断每个公司拥有哪些子公司。
假设我们现在在考虑S公司,那么步骤如下:
1. 开始只有S公司自己,设为集合A。
2. 进入死循环1号,令p=false
3. 枚举所有集合A外的公司v,对每个v:
2.1 设s=0
2.2 枚举所有集合A内的公司u,若存在边(u,v)=c,则s+=c。
2.3 若s>50,说明v是S的子公司,并把v加入集合A,令p=true
3. 若p==true,则说明此轮发现了新的子公司,什么也不做,回归死循环1号;若p==false,则说明此轮并未发现子公司,那么退出死循环1号
4. 至此,集合A便是S的所有子公司(包括S自己),按照升序输出即可
而外围,只要保证所考虑的S公司也是升序,就可以保证最终结果完全升序了。
分析时间,100个公司,而每个公司死循环1号执行一轮的时间是100,每轮至少找到一个子公司,因此死循环1号至多执行100轮。
总计时间:100*100*100=1000000,没问题。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
第二次AC。
第一次没保证每个公司的子公司是升序输出的-.-
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: concom
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; const int N=;
bool have[+N]; int E[+N][+N]; void look(int S,ostream& out)
{
int A[N],Ai=,Aj=;
bool IN[+N]={},R[+N]={};
A[Aj++]=S; IN[S]=true;
while(true)
{
bool p=false;
for(int v=;v<=N;++v)
if(have[v] && !IN[v])
{
int s=;
for(int i=Ai;i!=Aj;++i)
{
int u=A[i]; s+=E[u][v];
}
if(s>)
{
R[v]=true;
A[Aj++]=v; IN[v]=true;
p=true;
}
}
if(p==false) break;
}
for(int i=;i<=N;++i)
if(R[i]) out<<S<<' '<<i<<endl;
} int main()
{
ifstream in("concom.in");
ofstream out("concom.out"); int M; in>>M;
for(int i=,u,v,c;i<=M;++i) { in>>u>>v>>c; have[u]=have[v]=true; E[u][v]=c; } for(int i=;i<=N;++i)
if(have[i]) look(i,out); in.close();
out.close();
return ;
}
USACO Section2.3 Controlling Companies 解题报告 【icedream61】的更多相关文章
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section2.1 Ordered Fractions 解题报告
frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】
nocows解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Longest Prefix 解题报告 【icedream61】
prefix解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- PHP:将json数据放进html标签中的详细讲解
1.在controller中调用某方法,得到最终的json数据.根据框架开发形式,将Json数据传入视图中 2.在视图中,我们放置一个hidden形式的标签,并获取到json数据 3.这时候,我们查看 ...
- OpenGL纹理高级
矩形纹理 对于二维纹理来说,除了GL_TEXTURE_2D之外,使用GL_TEXTURE_RECTANGLE就可以使用矩形纹理. 矩形纹理几大特点: 不能Mip,只能加载glTexImage2D的le ...
- java集合框架——Map
一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
- Jmeter文件目录,功能简介
1.Jmeter文件目录:1)bin文件: Jmeter启动:bin/jmeter.bat Jmeter日志文件:jmeter.log Linux的启动文件:Jmeter.sh Jmeter系统配置文 ...
- 等待唤醒机制,UDP通信和TCP通信
等待唤醒机制 通过等待唤醒机制使各个线程能有效的利用资源. 等待唤醒机制所涉及到的方法: wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中. notify():唤醒, ...
- C# while语句
一.C# while语句 while语句是用于重复执行程序代码的语句. 语法格式如下: while(boolean-expression){ embedded-statement} 当boole ...
- xpath模块
W3School官方文档:http://www.w3school.com.cn/xpath/index.asp 我们使用xpath主要是获取网页数据的,之前一直是使用bs4,xpath也是最近了解到的 ...
- 【Java】异常 —— throw, throws, try catch 相关内容
嗯……面试考到了这个,又是一个如无意外 那么接下来就总结吧 一.什么是异常 程序运行过程中发生的异常事件. RuntimeException通常是因为编程员因为疏忽没有检查而引起的错误. 二.Exce ...
- v-if
vue中通过v-if,v-else-if,v-else的对应的Boolean值来操作元素在dom中是否移除. 这里就以单纯的true,false来模拟一下.注:标签属性去出来的值为string类型. ...
- linux下安装xtrabackup
下载需要的版本的xtrabackup软件包,链接如下: https://www.percona.com/downloads/XtraBackup/LATEST/ percona-xtrabackup- ...