回 帖 发 新 帖 刷新版面

主题:聪明的阿卑多[改编]

我是小学生,到这来求教:
聪明的阿卑多

Time Limit:10000MS  Memory Limit:65536K
Total Submit:18 Accepted:13 
Case Time Limit:1000MS 

Description 

【问题描述】: 
也许你从没听说过阿卑多,但你一定知道他爷爷的爷爷的爷爷,那就是聪明绝顶的阿凡提先生。是的,阿卑多也是个聪明的小孩。 
一天,阿卑多骑着他的小毛驴,在小镇上晃悠,正好遇上了小巴依——那个自以为是的小财主。小巴依正在炫耀他的金币:“你们见过这样的金币么?这可不是一般的金币,你看它们多大多重啊!最主要的是,它们每个上面都刻有我的名字和一个编号,是独一无二的!看看,从我出生开始,每2个月,爸爸便给我1个特做的大金币,并从1开始编号,现在我已经有60枚了,哈哈……” 
小巴依见了阿卑多,于是便想考一考他:“阿卑多,听说你是最聪明的。给你任意三个顶点A,B,C,问你从顶点A走到顶点B并且经过顶点C的最短路径的条数有多少?如果你能算出,那么就奖你一枚金币;如果不能,就给我做三年长工好了。” 
阿卑多想了一想,自己完成没有多大的问题,现在他想来考考学习信息学奥赛的你,请你编程帮助他来顺利的完成。 


Input 

输入的第一行为两个正整数m、n,m表示顶点的个数,n表示边的条数,第二行为三个整数A,B和C,A表示起点,B表示终点,C表示要问你经过那个顶点;接下来有n行分别表示两条相临的边的编号及距离;

Output 

输出从顶点A到顶点B,经过C这个顶点的最短路径的条数。 
【数据范围】:0 < m<= 1000,n <= 499500,所有数据计算过程中都不会超过longint; 


Sample Input 


4 5
1 4 2
1 2 2
1 3 1
2 4 2
2 3 1
3 4 3


Sample Output 


2

Source 

xinyue

回复列表 (共1个回复)

沙发

program exgold;

var
  a:array[1..15] of longint;
  n,num,min,i,j,total,x,y,z:longint;
  can,used:array[1..1000] of boolean;
function test:longint;
  var
    x,i,j:longint;
    b:array[1..1000] of longint;
  begin
    test:=0;
    fillchar(can,sizeof(can),false);
    min:=1;
    for i:=1 to num do
      if a[i]<>0 then
        begin
          x:=test;
          for j:=1 to test do
            if (b[j]+a[i]<=n) and not can[b[j]+a[i]] then
              begin
                x:=x+1;
                b[x]:=b[j]+a[i];
                can[b[x]]:=true;
              end;
          if not can[a[i]] then
            begin
              x:=x+1;
              b[x]:=a[i];
              can[b[x]]:=true;
            end;
          test:=x;
          if test>=n then
            exit
          else
            while can[min]=true do
              min:=min+1;
        end;
  end;
begin
  fillchar(used,sizeof(used),false);
  readln(n);
  a[1]:=1;
  num:=1;
  repeat
    num:=num+1;
    a[num]:=a[num-1]*2;
    used[a[num-1]]:=true;
  until
    a[num]>n;
  num:=num-1;
  total:=1;
  for i:=3 to num do
    begin
      x:=a[i];
      for j:=1 to n do
        if not used[j] then
          begin
            a[i]:=j;
            if test=n then
              total:=total+1
            else if min<j then
              break;
          end;
      a[i]:=x;
    end;
  writeln(num,' ',total);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册