[0625]Jsoi A Test Problem4 Choose the hotel

本文详细介绍了JSOI2012春季函授A层次考试中的一道关于最短路径的问题,通过实例分析了如何解决此类问题,并提供了详细的解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景 Background 
JSOI2012春季函授A层次考试题
描述 Description 
顾神牛到达目的地后,打算找个旅馆住下好好享受一下他愉快的假期。该地有n个风景区,每个风景区中心都有一个旅馆,其中m对风景区是可以互相到达的,且距离为1。顾神牛希望他挑选的旅馆和离旅馆最远的风景区之间的距离尽量最短(风景区、旅馆本身的大小忽略不计,看作同一个点)。
输入格式 Input Format 
第一行两个整数n  m,表示总共n个风景区和m对关系。
以下m行,每行两个整数x  y,表示第x个风景区和第y个风景区可以互相到达。
输出格式 Output Format 
一个整数,表示旅馆和离旅馆最远的风景区的距离,该距离要求是最短的。
样例输入 Sample Input 
3 2     
1 2
1 3
样例输出 Sample Output 

时间限制 Time Limitation 
各个测试点1s
【数据规模】
n<=1000
m<=15000
注释 Hint 
JSOI2012春季函授A层次考试题

最短路径图应用。

var
  v:array [0..1001] of boolean;
  g,e:array [0..1001] of longint;
  d:array [0..1001,0..1001] of longint;
  t,s,next:array [0..100001] of longint;
  a,b,c,n,m,j,k,r,i,l,now,ans,u:longint;
begin
  readln(n,m);
  r:=0;
  for i:=1 to m do
    begin
      readln(a,b);
      inc(r);t[r]:=b;
      if g[a]=0 then
        begin
          g[a]:=r;e[a]:=r;
        end
      else
        begin
          next[e[a]]:=r;e[a]:=r;
        end;
      inc(r);t[r]:=a;
      if g[b]=0 then
        begin
          g[b]:=r;e[b]:=r;
        end
      else
        begin
          next[e[b]]:=r;e[b]:=r;
        end;
    end;
  ans:=maxlongint;
  for i:=1 to n do
    begin
      for j:=1 to n do
        d[i][j]:=maxlongint shr 1;
      d[i][i]:=0;
      fillchar(v,sizeof(v),false);
      l:=1;r:=1;s[l]:=i;v[i]:=true;
      while l<=r do
        begin
          u:=g[s[l]];
          while u<>0 do
            begin
              if d[i][t[u]]>d[i][s[l]]+1 then
                begin
                  d[i][t[u]]:=d[i][s[l]]+1;
                  if not v[t[u]] then
                    begin
                      v[t[u]]:=true;
                      inc(r);
                      s[r]:=t[u];
                    end;
                end;
              u:=next[u];
            end;
          v[s[l]]:=false;
          inc(l);
        end;
      now:=0;
      for j:=1 to n do
        if d[i][j]>now then now:=d[i][j];
      if now<ans then ans:=now;
    end;
  writeln(ans);
end.

转载于:https://www.cnblogs.com/shy-/archive/2012/06/28/2568602.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值