分糖果_解题报告_SSL2339_tyvj1083_spfa

Description

童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?
输入格式Input Format 第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。

第二行为一个数m,表示小朋友吃糖的时间。

Input

第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。

第二行为一个数m,表示小朋友吃糖的时间。

下面p行每行两个整数,表示某两个小朋友在彼此身旁

Output

一个数,为所有小朋友都吃完了糖的时间

Sample Input

4 3 1

2

1 2

2 3

1 4

Sample Output

5

Hint

40%的数据满足:1<=n<=100

60%的数据满足:1<=n<=1000

100%的数据满足:1<=n<=100000

m<=n*(n-1)/2,不会有同一个关系被描述多次的情况。

思路:

题目的真相是找到一条最长的最小代价路,数据之大spfa无疑。在所有的最短路中找到一条最长路保证所有的孩子都拿到糖,注意最后加上吃糖的时间。路是双向的,被坑地蛋碎一地。

源代码/pas:

type
rec=record
  x,y,w,next:longint;
end;
var
  n,m,time,p:longint;
  g:array[1..2000000]of rec;
  ls,d:array[1..100000]of longint;
  state:array[1..100000]of longint;
  v:array[1..100000]of boolean;
  max:int64;
procedure init;
var
  i:longint;
begin
  readln(n,m,p);
  readln(time);
  for i:=1 to n do ls[i]:=0;
  for i:=1 to m do
  begin
    with g[i*2-1] do
    begin
      read(x,y);
      w:=1;
      next:=ls[x];
      ls[x]:=i*2-1;
    end;
    with g[i*2] do
    begin
      w:=1;
      x:=g[i*2-1].y;
      y:=g[i*2-1].x;
      next:=ls[x];
      ls[x]:=i*2;
    end;
  end;
end;
procedure spfa;
var
  head,tail,t:longint;
begin
  head:=0;
  tail:=1;
  fillchar(state,sizeof(state),0);
  fillchar(v,sizeof(v),false);
  fillchar(d,sizeof(d),$7f div 2);
  d[p]:=0;
  state[1]:=p;
  v[p]:=true;
  repeat
    inc(head);
    t:=ls[state[head]];
    while t>0 do
    with g[t] do
    begin
      if d[x]+w<d[y] then
      begin
        d[y]:=d[x]+w;
        if not v[y] then
        begin
          v[y]:=true;
          inc(tail);
          state[tail]:=y;
        end;
      end;
      t:=next;
    end;
    v[state[head]]:=false;
  until head>=tail;
  max:=0;
  for t:=2 to n do
  if d[t]>max then max:=d[t];
  writeln(max+time+1);
end;
begin
  init;
  spfa;
end.
时间: 2024-11-09 00:44:43

分糖果_解题报告_SSL2339_tyvj1083_spfa的相关文章

加分二叉树_解题报告_SSL1033_2003年分区联赛提高组之三_树形dp

Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下: subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数 若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数.不考虑它的空 子树. 试求一棵符合中序遍历为(1,2,

POJ 2774 字符串哈希_解题报告

题目:  http://poj.org/problem?id=2774 A - Long Long Message The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother is getting ill. Being worried about spending so much on railway ticke

zoj 2313 Chinese Girls&#39; Amusement 解题报告

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求出最大的 K (1 ≤ K ≤ N/2),表示从编号为1的人开始,将球传递给他后一个人数起的第K个人,第K个人又传递给往后数的第K个人......要求这样传递下去,且每个人都有机会接到球.也就是不存在当未使得全部人都接到一次球的情况下,某个人接收到两次以上的球. 详细的解题报告在这里: http:/

hdu 1514 Free Candies 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514 题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里,篮子里最多放5个,如果篮子里有两个颜色相同的糖果则可以取走放进口袋里,问最多能取走多少对糖果放进口袋.n<=40, 糖果颜色最多20种. 这题是抄这个人滴:http://fudq.blog.163.com/blog/static/1913502382014239225290/ 有些地方看得不太懂,本

解题报告 smoj 2019初二创新班(2019.3.17)

目录 解题报告 smoj 2019初二创新班(2019.3.17) T1:找玩具 题目描述 题意转化 分析 代码 优化(代码复杂度) T2:闯关游戏 题目描述 分析 代码 T3:子数组有主元素 题目描述 分析 代码(\(O(nm\log n)\)) 优化 代码(\(O(nm)\)) 解题报告 smoj 2019初二创新班(2019.3.17) 时间:2019.3.21 T1:找玩具 题目描述 在游戏开始之前,游戏大师在房间的某些地方隐藏了N个玩具.玩具编号为1到N.您的任务是尽可能多地找到这些玩

解题报告-2019.12.16

解题报告-2019.12 题目:6-3[拓展编程题_课后练习3][P215 习题8-三-4] 报数 (20分) 题目详情: 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号.从第一个人开始报数,报到m(<n)的人退出圈子:下一个人从1开始报数,报到m的人退出圈子.如此下去,直到留下最后一个人. 本题要求编写函数,给出每个人的退出顺序编号. 函数接口定义:void CountOff( int n, int m, int out[] ); 其中n是初始人数:m是游戏规定的退出位次(保证为小于

2020-3-14 acm训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019 解题报告+补题报告

2020-3-15比赛解题报告+2020-3-8—2020-3-15的补题报告 2020-3-15比赛题解 训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019  A建筑(模拟) 耗时:3ms 244KB 建筑 你哥哥在最近的建筑问题突破大会上获得了一个奖项 并获得了千载难逢的重新设计城市中心的机会 他最喜欢的城市奈梅根.由于城市布局中最引人注目的部分是天际线, 你的兄弟已经开始为他想要北方和东方的天际线画一些想法

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

1503140001-蓝桥杯-历届试题 分糖果

历届试题 分糖果 时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 输入格式 程序首先读入一个整数N(2<N<100),表示小朋友的人数. 接着是一行用空格分开的N个偶数(