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)の間 解決する(); }