题目背景

船が往くよミライへ旅立とう

船只启航 朝未来展开旅途

青い空笑ってる(なにがしたい?)

湛蓝天空露出微笑(想做些什么?)

ヒカリになろうミライを照らしたい

化作光芒吧 想就此照亮未来

輝きは心からあふれ出してもっと先の景色望むんだ

光辉自内心满溢而出 愿能望见更加前方的景色

Ah!やっと手にしたミライチケットかざして…!

Ah!挥舞起终于得手的未来门票…!

我们Aqours,终于闪闪发亮了!

2月25和26日,将是我们登上横滨ARENA演唱的日子!

而且,还要在全日本、甚至全世界的好多影院进行转播呢!

转播好像还是通过中继卫星传输的呢!

未来ずら!

题目描述

不过,好像中继卫星上,出了一些问题呢……

我们的中继卫星一共有N颗,编号成1到N。不过,好像一个中继卫星可以且仅可以单向地从另一颗中继卫星那儿接收数据。

第i颗卫星现在已经被设定到了从第Ai颗卫星 (称为接收源) 那儿接受数据。

不过这些中继卫星的接收源是可以修改的,只不过每次修改要花一定的资金呢。

听说要达成中继的话,这些卫星之间必须两两之间能够互相(直接或间接)通信才行啊。

虽然鞠莉家里很有钱,可是这么大的花费,也得提前准备一下呢。

所以,你能帮我们算算这样子一共最少要花多少钱吗?

输入输出格式

输入格式:

第一行1个整数N。

接下来N行,每行2个整数Ai,Ci,表示初始时,第i个中继卫星从第Ai颗卫星处接收数据,以及该卫星调整接收源的所需花费。

输出格式:

输出一个整数,表示鞠莉所需准备的最小的花费。

输入输出样例

输入样例#1:

4
2 2
1 6
1 3
3 1
输出样例#1:

5

说明

10% N<=10
40% N<=15
70% N<=3000
100% 2<=N<=100000, 1<=Ci<=10^9

以下是彩蛋

事实上LoveLive的直播卫星中继只有一颗星,而且永远都是不加密的。

导致只要有一个卫星锅就可以在家偷偷看直播,也就是传说中的卫星源。

lin_toto: 万代南梦宫都把浅水湾给买了,居然只有回放,只好跑到香港the sky去看+手动滑稽。

至于为什么看转播,eplus表示LoveLive系列演唱会的票大家尽管抽选尽管抢,买得到算我输。

于是lin_toto在去年μ's Final LoveLive的时候拿肉鸡把eplus搞趴下了,然后就买到了。

于是今年eplus连抢票都不让抢了,全抽选,抽得到算我输。

然后lin_toto就去看转播了。

大概是个贪心乱搞题。

先把所有的连有多条边的点上费用较小的边删去,使只剩一条边。

这时可能还有环,然后在环上讨论一下是选环上的最小边还是重新加上以前删掉的某条边再去掉那个点相邻的环上的边,这样乱搞一搞就好了。

然后要特判的就是如果整个图就是一个环,ans=0

吐槽:月赛的时候没开int64,挂成40;后来改了int64,80,怀疑自己算法错了;然后发现自己特判整个图是一个环的时候直接用所有点入度出度都是1判断了,所以就把多个环也判成一个环了;于是然后加了个并查集,过了。

 program rrr(input,output);
const
inf=;
type
etype=record
t,next:longint;
w:int64;
end;
var
e:array[..]of etype;
a,b,siz,father:array[..]of longint;
c:array[..]of int64;
n,i,j,k,cnt:longint;
ans,max,mmax,min:int64;
flag:boolean;
v,vis:array[..]of boolean;
procedure add(x,y:longint;w:int64);
begin
inc(cnt);e[cnt].t:=y;e[cnt].w:=w;e[cnt].next:=a[x];a[x]:=cnt;
end;
function find(k:longint):longint;
begin
if father[k]=k then exit(k);
father[k]:=find(father[k]);
exit(father[k]);
end;
begin
assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
readln(n);
fillchar(a,sizeof(a),);cnt:=;fillchar(siz,sizeof(siz),);
for i:= to n do begin readln(b[i],c[i]);inc(siz[b[i]]);add(b[i],i,c[i]); end;
flag:=true;
ans:=;
for i:= to n do
if a[i]<> then
begin
j:=a[i];max:=;
while j<> do
begin
ans:=ans+e[j].w;
if e[j].w>max then begin k:=e[j].t;max:=e[j].w; end;
j:=e[j].next;
end;
ans:=ans-max;
j:=a[i];
while j<> do begin if e[j].t<>k then b[e[j].t]:=;j:=e[j].next; end;
end
else flag:=false;
if flag then
begin
for i:= to n do father[i]:=i;
for i:= to n do
begin
j:=find(i);k:=find(b[i]);
if j<>k then father[j]:=k;
end;
flag:=true;
for i:= to n do if find(i)<>find() then begin flag:=false;break; end;
if flag then begin write();halt; end;
end;
fillchar(v,sizeof(v),false);
fillchar(vis,sizeof(vis),false);
for i:= to n do
if not v[i] then
begin
j:=i;flag:=false;
while true do
begin
if vis[j] then begin flag:=true;break; end;
if v[j] then break;
v[j]:=true;vis[j]:=true;
if b[j]= then break else j:=b[j];
end;
k:=i;while vis[k] do begin vis[k]:=false;k:=b[k]; end;
if not flag then continue;
min:=inf;
while not vis[j] do
begin
vis[j]:=true;
if c[j]<min then min:=c[j];
if siz[j]> then
begin
mmax:=;max:=;
k:=a[j];
while k<> do
begin
if e[k].w>mmax then begin max:=mmax;mmax:=e[k].w end
else if e[k].w>max then max:=e[k].w;
k:=e[k].next;
end;
if mmax-max<min then min:=mmax-max;
end;
j:=b[j];
end;
ans:=ans+min;
while vis[j] do begin vis[j]:=false;j:=b[j];end;
end;
write(ans);
close(input);close(output);
end.

最新文章

  1. Android自定义控件----RadioGroup实现APP首页底部Tab的切换
  2. Nodejs&#183;内存控制
  3. Vs 2013 单步调试 .net framework 中遇到的问题
  4. Apple Watch应用开发经验谈:我遇到的那些坑
  5. (POJ 1797) Heavy Transportation 最大生成树
  6. 导入外部jar包的方法
  7. Hibernate三 关联关系
  8. python打包成exe
  9. 一行一行分析JQ源码学习笔记-02
  10. CSS,height:auto和height:100%有什么区别?
  11. [HDU1020] Encoding - 加密
  12. 关于XAMPP环境配置
  13. 一次线上Mysql数据库崩溃事故的记录
  14. python3.5安装pyHook,解决【TypeError: MouseSwitch() missing 8 required positional arguments: &#39;msg&#39;, &#39;x&#39;, &#39;y&#39;, &#39;data&#39;, &#39;time&#39;, &#39;hwnd&#39;, and &#39;window_name&#39;】这个错误!
  15. Web渗透测试(sql注入 access,mssql,mysql,oracle,)
  16. Mybaits-plus实战(二)
  17. http验证
  18. 详解Django的CSRF认证
  19. 向github上提交自己的project
  20. BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)

热门文章

  1. 2016-2017-2 《Java程序设计》第二周学习总结
  2. 20155323 2016-2017-2 《Java程序设计》第10周学习总结
  3. PANIC: HOME is defined but could not find Nexus_4_API_22.ini file in $HOME/.android/avd (Note: avd is searched in the order of $ANDROID_AVD_HOME,$ANDROID_SDK_HOME/.android/avd and $HOME/.android/avd)
  4. 1150: [CTSC2007]数据备份Backup
  5. C#:在AnyCPU模式下使用CefSharp
  6. 解决E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
  7. Python接口测试实战2 - 使用Python发送请求
  8. flexbox的应用
  9. [转载] Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
  10. 20181023-9 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 06