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解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- PDO数据库类——对query()和exec()的异常监听
PDO异常类中,query()和exec()方法中执行失败时,默认情况下,我们是无法知道,具体执行失败的原因. 那如果我们想要监听异常的话,肿么整呢? 只要使用setAttribute()方法,即可监 ...
- IIS https绑定主机头方法 [可实现禁止直接通过IP访问及“IIS中绑定多个https(但需要多个IP地址)”]
步骤: 打开:%systemroot%\SYSTEM32\inetsrv\config\ 打开:applicationHost.config 查找:<binding protocol=" ...
- gcc常用参数列举
[参数详解] -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件 -S 只激活预处理和编译,就是指 ...
- ARM实验5 —— 按键中断实验
key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...
- MYSQL 之SET GLOBAL innodb_buffer_pool_size =n
工作遇到一个情况是索引相同的情况下,mysql服务在linux上运行很快,在windows服务器上运行很慢,版本是V5.7以后得版本,同事查找了下说应该设置 SET GLOBAL innodb_buf ...
- 2017.11.22 mysql数据库实现关联表更新sql语句
比如有两张表,其中一张表某个字段的值要关联另一张表进行统计,就要用到mysql的update方法,并且left join另一张表进行联合查询. mysql关联表更新统计 sql语句如下: 代码如下 复 ...
- 2017.10.6 Java命名规范及使用情况
Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用 ...
- Ajax的学习笔记(一)
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),ajax并不是一门单独的语言,而是一种技术,是指一种创建交互式网页应用的网页开发技术. ...
- springboot整合activiti报错[processes/]不存在解决方案
springboot整合activiti时,启动抛异常 nested exception is java.io.FileNotFoundException: class path resource [ ...
- Linux平台下卸载MySQL的方法
转载自: https://www.cnblogs.com/taomylife/p/7234925.html Linux平台下卸载MySQL的方法: MySQL的安装主要有三种方式:二进制包安装.RPM ...