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解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- TP5.1:依赖注入、绑定一个类到容器里、绑定一个闭包到容器中
依赖注入 1.在application中创建一个文件夹,名字为commom,commom文件夹中创建被注入文件夹,在被注入文件夹中创建一个名为demo.php的文件 2.在demo.php中输入: 3 ...
- ubuntu查看nvidia显卡状态
nvidia-smi 连续查看显卡状态 sudo watch nvidia-smi
- Altium_Designer-原理图库如何添加低电平有效的管脚?
在编辑元件原理图符号时,在display name选项中将要加低电平的字符后面都加上“\”即可,如图:
- SAP成都研究院Sunshine: 我的C4C实习感受和保研之路
今天的文章来自SAP成都一位实习生,曾经和Jerry同在C4C成都开发团队一起工作过.在Sunshine最后一个工作日里,Jerry和Sunshine一起吃饭的时候,她曾经聊到接下来的保研打算和将来工 ...
- 剑指offer 和为s的两个数字的调试
这是整个调试, for (int i:s) cout<<i<<endl;这句话是c++11特性下的一种遍历方式 在编译的时候需要加-std=c++11,即g++ 41.cpp ...
- Linux下进程信息的深入分析[转]
这里我们主要介绍进程的状态,进程的状态可以通过/proc/PID/status来查看,也可以通过/proc/PID/stat来查看. 如果说到工具大家用的最多的ps也可以看到进程的信息.这里我们通过/ ...
- AngularJS 外部文件中的控制器其他实例
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- iOS 远程通知(Remote Notification)和本地通知(Local Notification)
ios通知分为远程通知和本地通知,远程通知需要连接网络,本地通知是不需要的,不管用户是打开应用还是关闭应用,我们的通知都会发出,并被客户端收到 我们使用远程通知主要是随时更新最新的数据给用户,使用本地 ...
- int ,long long 范围
类型名称 字节数 取值范围signed char 1 -128-+127short int 2 -32768-+32767int 4 -2147483648-+2147483647(10位数 2^31 ...
- 差点掉坑,MySQL一致性读原来是有条件的
众所周知,在设定了隔离等级为Repeatable Read及以上时,InnoDB 可以实现数据的一致性读.换句话来说,就是事务执行的任意时刻,读取到的数据是同一个快照,不会受到其他事务的更新影响. 以 ...