zoukankan      html  css  js  c++  java
  • 路径

    【问题描述】
    给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
    输入:
    第一行包含一个正整数n,表示点数。
    接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。

    【输出】
    一个整数,即最小费用。
    【输入输出样】:
    path.in path.out
    5
    2 2
    1 1
    4 5
    7 1
    6 7 2

    【数据范围】
    对于30%的数据,1<=n<=100;
    对于60%的数据,1<=n<=1000;
    对于全部的数据,1<=n<=200000;

    【解题思路】

    这个题目最重要的问题是存边,毕竟有20000个点,最大有n*(n-1)/2条边,比较悲惨,不过,不过……其实只需要按x排一次序,再按y排一次序,把最近的两个点分别连边,似乎再跑一遍堆优化的dij,或者spfa就能过,很可惜。。。我不会写,于是写的60%的数据,顺便跑一边dij

    program path1;
    type pathh=record
          x,y:longint;
          end;
    var f:array[1..2000,1..2000] of longint;
        b:array[1..2000] of boolean;
        n,i,min,minn,j,k:longint;
        pa:array[1..2000] of pathh;
    function vmin(a,b:Longint):longint;
    begin
        if a>b then exit(b) else exit(a);
    end;
    
    begin
        assign(input,'path.in'); reset(input);
        assign(output,'path.out'); rewrite(output);
        read(n);
        for i:=1 to n do read(pa[i].x,pa[i].y);
        for i:=1 to n do
            for j:=1 to n do
        f[i,j]:=vmin(abs(pa[i].x-pa[j].x),abs(pa[i].y-pa[j].y));
        fillchar(b,sizeof (b),false);
        b[1]:=true;
        for k:=2 to n do
        begin
          min:=maxlongint;;
           for i:=2 to n do
           if (f[1,i]<min)and(b[i]=false) then
            begin
                min:=f[1,i];
                minn:=i;
            end;
            b[minn]:=true;
            for j:=1 to n do
             if (j<>minn) and (f[1,minn]+f[minn,j]<f[1,j]) and(b[j]=false) then
              f[1,j]:=f[1,minn]+f[minn,j];
              end;
          writeln(f[1,n]);
          close(input);
          close(output);
    end.
  • 相关阅读:
    selenium使用
    爬取梨视频
    django实现事务
    django admin模块使用
    跨域问题和django中实现跨域
    Java多线程Condition定点通知
    Java创建线程四种方式
    JVM之JVM体系结构
    Java线程状态
    Java正则表达式解析网页源码
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4744003.html
Copyright © 2011-2022 走看看