変形最短パス(最大値と最小値)

http://poj.org/problem?id=1797

質問の意味:N都市、各側の双方向エッジは重み値を負担する権利を有するM、Nの最大を求め負荷1。

溶液を0に初期化、更新、大きなエッジの重みから選択されるDIS場合[J] <分(DIS [POS]、MA [POS] [J])軸受重み更新j個到達するようできるだけ大きく。

//#<ビット/ STDC ++。H>含みます
書式#include <cstdioを>
書式#include <CStringの>
書式#include <cmath>
書式#include <アルゴリズム>
書式#include <iostreamの>
書式#include <文字列>
書式#include <stdio.hに>
書式#include <キュー>
書式#include <スタック>
書式#include <マップ>
書式#include <セット>
書式#include <string.hの>
書式#include <ベクトル>
書式#include <stdlib.h>に含ま
名前空間stdを使用。
長い長いLLのtypedef。
#define int型LL
#defineモッズ100
#define GCD(M、N)__gcd(M、N)
#define REPは(I、J、N)のための(INT iはjは=; I <= N; I ++)
#defineは、赤色(I、N、j)のための(INT I = N; I> = J; i--)
#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を
// INT LCM(INT A、INT b)は{* B / GCD(A、B)を返します;}
一方、(B){IF(B&1)ANS = ANS *%のMOD; //は(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A *%のMOD;}リターンANS;}
// INT euler1(INT X){int型ANS = X;のために(INT iが= 2、iは<= X *; I ++)IF(X%I == 0){ans- = ANS / I、一方(X %I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;}
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN}
#define INF 0x3f3f3f3f
#define PIのACOS(-1)
#define PIIペア<int型、int型>
#define Fiの最初の
#define SE秒
#define LSONリットル、ミッド、根<< 1
#define rson半ば+ 1、R、根<< 1 | 1
#define PB一back
#define融点make_pair
(V)v.begin()、v.end()すべてを#defineし
#defineサイズ(V)(int型)(v.size())
#define CIN(X)のscanf( "%のLLD"、&x)は、
CONST INT N = 1E5 + 9。
const int型MAXN = 1E3 + 9。
CONSTダブルESP = 1E-6。
私の[MAXN] [MAXN]のこぎりをINT [MAXN]と言う[MAXN]。
整数N、M、CNT。

無効ダイクストラ(int型U){
    担当者(I、1、N){
        DIS [C] =および[U] [C]。
    }
    VIS [U] = 1。
    担当者(I、1、N-1){
        int型POS;
        int型MAXX = -INF。
        担当者(J、1、N){
            (もし!VIS [J] && MAXX <DIS [J]){
                POS = J;
                MAXX = DIS [J]。
            }
        }
        [POS] = 1;
        担当者(J、1、N){
            (もし!VIS [J] &&分(DIS [POS]、MA [POS] [J])> DIS [J]){
                DIS [J] =分(DIS [ポスト]、MA [ポスト] [J])。
            }
        }
    }
}

ボイドのinit(){
    ME(0時)。
    ME(ビュー、0);
}
ボイドは、{()解決します
    初期化();
    scanf関数( "%LLD%LLD"、&N、&M)。
    担当者(I、1、M){
        Uをint型、V、W;
        scanf関数( "%LLD%LLD%LLD"、&U&V、およびW)
        [U] [V] [V] [U] = MAX(W [V] [U]で)IN =において、
    }
    ダイクストラ(1)。
    COUT << "シナリオ#" << ++ CNT << ":" << ENDL << DIS [N] << ENDL << ENDL。
}

主符号付き()
{
    初期化();
    int型T;
    cinを>>トン。
    一方、(T  - ){
        解決する();
    }
}

 http://poj.org/problem?id=2253

質問の意味:カエルは1からnまで、カエルは、ロックnを与え、別の岩にジャンプする、最小距離は、ジャンプの最小数を必要?

溶液:更新:DIS [j]が最小の最大距離に到達するようにDISなら[J]> MAX(DIS [POS]、POS [J])、

//#<ビット/ STDC ++。H>含みます
書式#include <cstdioを>
書式#include <CStringの>
書式#include <cmath>
書式#include <アルゴリズム>
書式#include <iostreamの>
書式#include <文字列>
書式#include <stdio.hに>
書式#include <キュー>
書式#include <スタック>
書式#include <マップ>
書式#include <セット>
書式#include <string.hの>
書式#include <ベクトル>
書式#include <stdlib.h>に含ま
名前空間stdを使用。
長い長いLLのtypedef。
#define int型LL
#defineモッズ十億七
#define GCD(M、N)__gcd(M、N)
#define REPは(I、J、N)のための(INT iはjは=; I <= N; I ++)
#defineは、赤色(I、N、j)のための(INT I = N; I> = J; i--)
#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を
INT LCM(INT A、INT b)は{* B / GCD(A、B)を返します;}
一方、(B){IF(B&1)ANS = ANS *%のMOD; //は(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A *%のMOD;}リターンANS;}
// INT euler1(INT X){int型ANS = X;のために(INT iが= 2、iは<= X *; I ++)IF(X%I == 0){ans- = ANS / I、一方(X %I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;}
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN}
#define INF 0x3f3f3f3f
#define PIのACOS(-1)
#define PIIペア<int型、int型>
#define Fiの最初の
#define SE秒
#define LSONリットル、ミッド、根<< 1
#define rson半ば+ 1、R、根<< 1 | 1
#define PB一back
#define融点make_pair
(V)v.begin()、v.end()すべてを#defineし
#defineサイズ(V)(int型)(v.size())
#define CIN(X)のscanf( "%のLLD"、&x)は、
CONST INT N = 1E7 + 9。
const int型MAXN = 2E2 + 9。
CONSTダブルESP = 1E-6。
私の[MAXN] [MAXN]を倍増。
ダブルDIS [MAXN]。
INT VIS [MAXN]、N、M、CNT。
PII [MAXN]。

ボイドdijia(int型R){
    担当者(I、1、N){
        DIS [C] =および[R] [C]。
    }
    方法[R] = 1。
    担当者(I、1、N-1){
        int型POS;
        ダブルマイル= INF。
        担当者(J、1、N){
            (もし!VIS [J] && MI> DIS [J]){
                POS = J;
                MI = DIS [J]。
            }
        }
        [POS] = 1;
        担当者(J、1、N){
            二重X = MAX(DIS [POS]、MA [POS] [J])。
            (もし!VIS [J] && X <DIS [J]){
                伝える[J] = X;
            }
        }
    }
}
ボイドのinit(){
    フィル(MA [0]、MA [0] + MAXN * MAXN、INF)。
    ME(ビュー、0);
}
ボイドは、{()解決します
    初期化();
    int型のBX、EX、EYによって;
    scanf関数( "%LLD%LLD%LLD%LLD"、&BX、&、&EX、EY&によって);
    [1] = BX .NET、および[1] = .SEによって、及び[N] = EX .NET、および[N] = EY .SE。
    担当者(I、2、N-1){
        あなたと、V。
        scanf関数( "%LLD%LLD"、および[I] .fi、&[I] .SE)。
    }
    担当者(I、1、N){
        担当者(J、1、I-1){
            [I] [J] [J] IN = IN [I] =分([I] [J]で、SQRT(([I] .NET  -  [J] .NET)*([I]。 Fiの -  [J] .NET)+([I] .SE  - 及び[J] .SE)*([I] .SE  - 及び[J] .SE)))。
        }
    }
    dijia(1)。
    裁判所未満<< "シナリオ#" << ++ CNT <<てendl;
    printf( "蛙距離=%.3f \ n \ n" は、DIS [N])。
}

主符号付き()
{
    // int型トン。
    // cinを>>トン。
    //しばらく(t--)
    (〜のscanf( "%のLLD"、&n)は&& n)の間
        解決する();
}

 

おすすめ

転載: www.cnblogs.com/nonames/p/12543858.html