[HLOI 2015]Magic

原创 2015年07月11日 10:47:50

Magic

时间限制 2S 内存限制 128M

题目描述

给定n个点m条边的图,每个点有一个点权ai,两点之间的边的边权为两点点权的最小公倍数。
从1号点走到n号点所需要的花费为路径上边权的最大值。
问从1号点走到n号点需要的最小花费为多少?

输入

第一行输入整数n和m
接下来一行n个数,第i个数ai代表第i个点的点权
接下来m行,每行2个数u,v,代表第u个点与第v个点之间有一条边
对于30%的数据,1<=n,m<=100,1<=u,v<=n,1<=ai<=1000
对于60%的数据,1<=n<=100,1<=m<=10000,1<=u,v<=n,1<=ai<=1000
对于100%的数据,1<=n,m<=100000,1<=u,v<=n,1<=ai<=1000

输出

输出一个整数代表最小花费

样例输入

3 3
2 3 5
1 3
3 1
2 2

样例输出

10

样例提示:

只有一条路径从1到3,边权为10,故最小花费为10

题解

  • 二分+最短路,裸题
  • 第一次看见HLJ的省选
  • 这么写好像比标算还要优233
    对比我的代码风格2333333
const
    maxn=100000;
var
    p,dist,x:array[0..maxn]of longint;
    t:array[0..4*maxn]of longint;
    w:array[0..4*maxn,1..3]of longint;
    i,j,k:longint;
    n,m,a,b,c,len,l,r,mid,ans:longint;
function gcd(a,b:longint):longint;
begin
    if b=0
    then gcd:=a
    else gcd:=gcd(b,a mod b);
end;

function lcm(a,b:longint):longint;
begin
    exit(a*(b div gcd(a,b)));
end;

procedure init(a,b,c:longint);
begin
    w[len,1]:=b; w[len,2]:=c;
    if w[a,3]=0
    then w[a,3]:=len else w[w[a,1],3]:=len;
    w[a,1]:=len; inc(len);
end;

function spfa(a:longint):longint;
var head,tail,i,tt,v,dis:longint;
begin
    for i:=1 to n do
        dist[i]:=1000000000;
    dist[1]:=0; t[1]:=1; head:=1; tail:=2; p[1]:=1;
    while head<tail do
        begin
            v:=t[head]; inc(head); tt:=w[v,3];
            while tt<>0 do
                begin
                    if w[tt,2]>a then dis:=1 else dis:=0;
                    if dist[v]+dis<dist[w[tt,1]]
                    then
                        begin
                            dist[w[tt,1]]:=dist[v]+dis;
                            if p[w[tt,1]]=0
                            then begin t[tail]:=w[tt,1]; inc(tail); p[w[tt,1]]:=1; end;
                        end;
                    tt:=w[tt,3];
                end;
            p[v]:=0;
        end;
    if dist[n]=0 then exit(1) else exit(0);
end;

begin
    readln(n,m); len:=n+1; r:=0;
    for i:=1 to n do
        read(x[i]);
    for i:=1 to m do
        begin
            readln(a,b); c:=lcm(x[a],x[b]); if c>r then r:=c;
            init(a,b,c);
            init(b,a,c);
        end;
    l:=0;
    while l<r do
        begin
            mid:=(l+r)>>1;
            if spfa(mid)=0
            then l:=mid+1
            else r:=mid;
        end;
    writeln(l);
end.
var
 z,p,dist:array[0..100000]of longint;
 t:array[0..500000]of longint;
 w:array[0..300000,1..3]of longint;
 i,j:longint;
 n,m,k,s:longint;
 a,b,c,l,r,mid,head,tail,x,y,tt,pp:longint;
function gcd(a,b:longint):longint;
begin
 if b=0 then exit(a);
 gcd:=gcd(b,a mod b);
end;

function lcm(a,b:longint):longint;
begin
 exit(a*b div gcd(a,b));
end;

function spfa(a:longint):longint;
var
 i,j:longint;
begin
 for i:=2 to n do
  dist[i]:=100000000;
 head:=1; tail:=2; t[1]:=1; p[1]:=1;
 while head<tail do
  begin
   x:=head; y:=tail;
   for i:=head to tail-1 do
    begin
     tt:=w[t[i],3];
     while tt<>0 do
      begin
       if w[tt,2]>a then pp:=1 else pp:=0;
       if dist[t[i]]+pp<dist[w[tt,1]]
       then
        begin
         dist[w[tt,1]]:=dist[t[i]]+pp;
         if p[w[tt,1]]=0
         then begin t[y]:=w[tt,1]; inc(y); end;
        end;
       tt:=w[tt,3];
      end;
     inc(x);
     p[t[i]]:=0;
    end;
   head:=x; tail:=y;
  end;
 if dist[n]=0 then exit(1) else exit(0);
end;

begin
 //assign(input,'magic.in'); assign(output,'magic.out'); reset(input); rewrite(output);
 readln(n,m);s:=0; k:=n+1;
 for i:=1 to n do
  read(z[i]);
 readln;
 for i:=1 to m do
  begin
   readln(a,b); c:=lcm(z[a],z[b]);
   w[k,1]:=b;
   w[k,2]:=c;
   if w[a,3]=0
   then w[a,3]:=k
   else w[w[a,1],3]:=k;
   w[a,1]:=k;
   inc(k);
   w[k,1]:=a;
   w[k,2]:=c;
   if w[b,3]=0
   then w[b,3]:=k
   else w[w[b,1],3]:=k;
   w[b,1]:=k;
   inc(k);
   if c>r then r:=c;
  end;
 l:=0;
 while l<r do
  begin
   mid:=(l+r)div 2;
   if spfa(mid)=1
   then r:=mid
   else l:=mid+1;
  end;
 if spfa(l)=1
 then writeln(l)
 else writeln(-1);
 //close(input); close(output);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

[省选] [线段树] [DFS序] [矩阵快速幂] [HLOI2015] Tree

HLOI2015T3
  • HeRaNO
  • HeRaNO
  • 2016年05月02日 17:02
  • 611

[省选] [DP] [HLOI2015] Color

HLOI2015T2
  • HeRaNO
  • HeRaNO
  • 2016年05月02日 16:18
  • 396

微软线上笔试-2015-4-3(1,2题) Magic Box && Professor Q's Software

微软实习生线上笔试-2015-4-3(1,2题) Magic Box && Professor Q's Software

HLOI2016滚粗记

首先,别问我HLOI是哪里。。。。HLJ = 黑龙江。。。这次的省选总结起来还是由于我太弱,考试的时候状态不好,连个线段树都没想出来做了好久的火车到哈尔滨,车上打了一会扑克,感觉没过多长时间就到了进宾...

[省选] [扩展欧拉函数] [线段树] [BZOJ4869] [HLOI2017] 相逢是问候

题目传送门 这次省选没参加,首先恭喜三位神犇进队(哇咔咔咔同校三个都进了),看了看两天的题,一眼看上去除了这道题都没什么思路(是不是早该退役了……),然后就把这道题写了写,其他题都在BZOJ上,网上...
  • HeRaNO
  • HeRaNO
  • 2017年04月29日 02:15
  • 729

[省选] [数位DP] [HLOI2016] 幸运数字

HLOI2016Day2T3
  • HeRaNO
  • HeRaNO
  • 2017年03月31日 22:22
  • 540

HLOI2016 滚粗记

首先祝贺csc、ftw、yzm、qzh、lkr神犇们进队。 day0 上午:早上饭没吃好,吃得少还都吐了。感觉不好。吉大附中打板子。网络流、splay、2-SAT、并查集。(然而都没用上) ...

android5.0上,安装apk时校验dex文件的magic version是否为035

在android5.0上,安装apk时,在把apk中的dex文件转换为oat文件过程中,会校验dex文件头中的magic字段,要求为“dex\n035”; 一般dex文件头中,magic字段是“de...
  • yhtppp
  • yhtppp
  • 2015年04月02日 11:09
  • 3000

web magic 爬取京东 一个爬虫实现

改了下京东爬取例子 , 我喜欢一个爬虫的风格 看了很多什么责任链实现,但是我没有这么做,而是选择同个 用if else 来判断url 并爬取内容保存到static map 里面 最后就能入库了 jso...

【NOIP普及组2016】&魔法阵 This is magic!&

听闻老前辈们道这道题好像很难的样子,于是我就去做了…… 然后我就TLE了 于是偷偷瞟了一眼大老前辈们的博客,发现这道题好像,还是枚举,只是有用到【数学方法】优化罢了 完了完了,一提到数学,我脑子...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[HLOI 2015]Magic
举报原因:
原因补充:

(最多只允许输入30个字)