zoukankan      html  css  js  c++  java
  • 解题报告 Paid Roads

    Paid Roads

    【题目描述】

    这里有一个地图,嗯~准确的说是一个藏宝图。你在1号点,宝藏在n号点,所有的点编号1~n,这块宝底的地形是很奇怪的,每两个点之间有两条通路,两个通路的长度是不一样的,可能会有一条比较短,你可以任选一条,但是其中一条你只有在之前经过某个点的时才能通行,就好像这条路的通行证在那个点上一样。现在想知道怎么样走才能以最短的路程到达藏宝点。

    【输入格式】

    第一行两个用空格隔开的整数n和m分别表示节点的编号个数和该藏宝点路径条数。

    第二行到第m+1行每行5个整数a,b,c,la,lb描述从a点到b点的有向路,la表示之前经过c后,可以从a到b的路径长度,lb表示随时都可以同行的a到b的路径长度。

    【输出格式】

    一行一个整数表示的是从1到n的最短路程。如果没有路输出‘impossible’。

    【输入样例】

    4 5

    1 2 1 10 10

    2 3 1 30 50

    3 4 3 80 80

    2 1 2 10 10

    1 3 2 10 50

    【输出样例】

    110

    【数据范围】

    N,m<=10

    la,lb<=maxlongint

     

     

    这个题要用深搜。

    因为宽搜是走不了环的,但这个题需要走环,但是,一个环只能走一次,走这个环是为了减少某一条路的权值,所以去这个环上拿了通行证,就不用再来一遍了,标记判断。

     

    program lonely;

     

      type

        nod=record

          y,k,la,lb,next:longint;

        end;

     

      var

        map:array[0..100] of nod;

        v:Array[0..100] of longint;

        i,m,x,y,k,la,lb,ans,len,n:longint;

        first:array[0..100] of longint;

        ff:boolean;

     

      procedure dfs(x:longint);

        var

          t,y,temp,ll:longint;

        begin

          if x=n then

            begin

              ff:=true;

              if len<ans then ans:=len;

              exit;

            end;

          if len>ans then exit;

          t:=first[x];

          while t<>0 do

            begin

              y:=map[t].y;

              if v[y]<=4 then

                begin

                  temp:=map[t].k;

                  ll:=map[t].lb;

                  if v[temp]>0 then

                    if map[t].la<ll then ll:=map[t].la;

                  inc(v[y]);

                  len:=len+ll;

                  dfs(y);

                  len:=len-ll;

                  dec(v[y]);

                end;

              t:=map[t].next;

            end;

        end;

     

      begin

        assign(input,'roads.in');

        reset(input);

        assign(output,'roads.out');

        rewrite(output);

     

        readln(n,m);

        for i:=1 to m do

          begin

            readln(x,y,k,la,lb);

            map[i].y:=y;

            map[i].k:=k;

            map[i].la:=la;

            map[i].lb:=lb;

            map[i].next:=first[x];

            first[x]:=i;

          end;

        fillchar(v,sizeof(v),0);

        ans:=maxlongint >> 1;

        ff:=false;

        len:=0;

        inc(v[1]);

        dfs(1);

        if not ff then writeln('impossible') else writeln(ans);

     

        close(input);

        close(output);

      end.

     

  • 相关阅读:
    C#执行cmd命令
    mongodb 高级查询详解(2)
    mongodb-管道操作:常规查询
    python-pymongo高级查询
    traceback异常打印
    Sanic基础和测试
    Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
    POST提交数据的四种方式
    pymongo基础:入门
    python中__name__的意义
  • 原文地址:https://www.cnblogs.com/SueMiller/p/2226787.html
Copyright © 2011-2022 走看看