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解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- firewalld 使用简介
学习apache安装的时候需要打开80端口,由于centos 7版本以后默认使用firewalld后,网上关于iptables的设置方法已经不管用了,想着反正iptable也不会用,索性直接搬官方文档 ...
- python 爬poj.org的题目
主要是正则表达式不熟练,基础知识不扎实,函数也不怎么会用,下次再深入了解这3个函数吧. 主要是一个翻页的功能,其实,就是通过一个url替换一下数字,然后得到一个新的url,再找这个新的链接的信息. # ...
- vue中的js动画与Velocity.js结合
vue里面除了用css写动画,还可以用js写动画,vue的transition中,定义了几个动画钩子 第一个动画钩子:@before-enter <div id='app'> <tr ...
- c++ 读入和写入文件
读入 #include<ifstream> ifstream infile; infile.open(img_dir); while(getline(infile,tmp)){ } 写入 ...
- Matlab 绘图实例
概要 每次用 Matlab 绘图都要搜一堆资料设置一些参数,本次将绘图中的一些参数设置实例展示在这里,以备不时之需.暂包括折线图,面积图. 折线图实例 下图是效果图: 图 1:折线图效果图 ...
- 散度(Divergence)和旋度(Curl)
原文链接 散度(Divergence) 散度的讨论应从向量和向量场说起.向量是数学中研究多维计算的基本概念.比如,速度可以分解为相互独立的分量,则速度就是一个多维的向量.假如空间中的每一个位置都有一个 ...
- 写给iOS小白的MVVM教程(序)
这几天,需要重构下部分代码,这里简要记录下.但是涉及的技术要点还是很多,所以分为多个篇章叙述.此教程来源于,并将于应用于实践,不做过多的概念性阐释和争论.每个篇章都会附上实际的可执行的代码.因涉及的技 ...
- Webpack4 学习笔记二 CSS模块转换
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack 打包css模块 webpack是js模块打包器, 如果在入口文件引入css文件或其它的less.sass等文件,需要 ...
- MySQL主从复制读写分离如何提高从库性能-实战
在做主从读写分离时候,需要注意主从的一些不同参数设置,来提高从库的性能,提高应用读取数据的速度,这样做很有必要的. 做读写分离复制主从参数不同设置如下(需要根据自己应用实际情况来设置): parmet ...
- Centos7-Mysql-5.6.41一主两从的搭建
01.准备工作 首先的前提条件你必须安装了mysql,而且知道你安装mysql配置文件的位置,接下来的事情就好办了. 我的搭建环境: 服务器1: 10.233.17.20 mysql-master(主 ...