トピックリンクします。http://acm.hdu.edu.cn/showproblem.php PID = 4858?
プロジェクトマネジメント
制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):3744受理提出(S):1409
問題の説明
私たちは大きなプロジェクトを構築しました!このプロジェクトは、多くのエッジに接続されたn個のノード、および通信プロジェクトを持っています!
2つのノード間の複数の側面であってもよいが、一辺の両端は、必ずしも異なるノードであることができます。
各ノードは、1つのエネルギー値を持っています。
:今、私たちはプロジェクト管理ソフトウェアを記述する必要があり、このソフトウェアは、二つの動作持っている
エネルギー値+一定値に1.プロジェクトを。
2.プロジェクトでプロジェクトと隣接のエネルギー値を確認して下さい。(複数の側面は、2つのその後の側面、二回数えてb値を求める権利があり、そのようなおよびBなども数回存在する場合)。
2つのノード間の複数の側面であってもよいが、一辺の両端は、必ずしも異なるノードであることができます。
各ノードは、1つのエネルギー値を持っています。
:今、私たちはプロジェクト管理ソフトウェアを記述する必要があり、このソフトウェアは、二つの動作持っている
エネルギー値+一定値に1.プロジェクトを。
2.プロジェクトでプロジェクトと隣接のエネルギー値を確認して下さい。(複数の側面は、2つのその後の側面、二回数えてb値を求める権利があり、そのようなおよびBなども数回存在する場合)。
入力
最初の行の整数T(1 <= T <= 3)、 試験データの数を表します。
次に、テストデータは、最初の2つの整数の行のn(1 <= N <=のそれぞれについて 100000) およびm(1 <= M <= N + 10)、 それぞれ、点とエッジ。
次いで、2つの数AおよびBのm行は、aとbの間にエッジがあることを示します。
そして、整数Q.
次いで、最初の番号のQラインは操作タイプcmdを示しています。CMDが0である場合、次の二つの数字は商品UVエネルギー値プラスのU V(0 <= V <=表すために 100)。
CMDが1である場合、次のUは問い合わせエネルギーUの値とプロジェクトに隣接の数を表します。
1からnまでの数字すべての点。
次に、テストデータは、最初の2つの整数の行のn(1 <= N <=のそれぞれについて 100000) およびm(1 <= M <= N + 10)、 それぞれ、点とエッジ。
次いで、2つの数AおよびBのm行は、aとbの間にエッジがあることを示します。
そして、整数Q.
次いで、最初の番号のQラインは操作タイプcmdを示しています。CMDが0である場合、次の二つの数字は商品UVエネルギー値プラスのU V(0 <= V <=表すために 100)。
CMDが1である場合、次のUは問い合わせエネルギーUの値とプロジェクトに隣接の数を表します。
1からnまでの数字すべての点。
出力
各クエリの場合、出力ラインは答えを表しています。
サンプル入力
1 3 2 1 2 1 3 6 0 1 15 0 3 4 1 1 1 3 0 2 33 1 2
サンプル出力
4 15 15
アイデア:それは暴力の形態と考えることができるが、暴力は、2つのカテゴリに分類され度自体に最適化された、隣接する点であり、一つは彼自身よりも大きい程度であり、他方は、独自の度未満である、決定することができますそのルート点を超える程度がNを超えていません
ラインで直接ポイント自体を通過するよりも大きい程度
コードを見てください:
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <cmath> の#include <ベクトル> の#include <地図> 使用して 名前空間STD。 typedefの長い 長いLL。 CONST LLのMOD = 1E9 + 7 。 CONST LL INF = 1E9 + 7 。 const int型 MAXN = 1E5 + 50 。 地図 < INT、INT > M [MAXN]。 int型N; INT デュ[MAXN]。 int型W [MAXN]、WW [MAXN]; // エネルギー値直接大きい度合いがデポジット自体隣接点は度よりも小さい横断 int型 V [MAXN]; //は各点のためのエネルギー値を保存する のint [MAXN]ヘッド。 INT CNT1、 構造体のエッジ { int型の X、Y、NUM; // エッジの数との間のXY エッジ() { X = Y = NUM = 0 ; } } A [MAXN]; 構造体E { int型に、次へと、 E () { 次に =へ= 0 ; } } E [MAXN]; BOOL CMP(CONSTエッジE1、CONSTエッジE2) { 場合)e1.x == e2.x(戻り e1.y <= e2.y。 返す e1.x < e2.x。 } ボイド add_edge(int型のx、int型のY) { E [CNT1] .TO = Y。 E [CNT1] .next = 頭部[X]。 ヘッド[X] = CNT1。 CNT1 ++ ; } int型のmain() { int型のT。 scanf関数(" %のD "、&T)。 一方、(T-- ) { memset(DU、0、はsizeof (DU))。 memset(W 0、はsizeof (W))。 memsetを(WW、0、はsizeof (WW))。 memset(V、0、はsizeof (V))。 memsetの(頭、0、はsizeof (ヘッド))。 CNT1 = 1 。 int型N、M。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 1 ; I <= M; iは++ ) { scanf関数(" %のDの%のD "、A&[I] .X、&A [I] .Y); M [A [I] .X] [A [I] .Y] = 1 ; M [A [I] .Y] [A [I] .X] = 1 ; // NUMは、辺の数を表すが回数カウントすることである } ソート(A + 1、A +を1 + M、CMP); //は重い側の取り扱いを容易 INTを = CNT 1。; のため(int型 Iが= 2 ; I <= M Iは++)// 重複排除側 { IF([I] .X == A [CNT] .X && A [I] .Y == A [CNTを] .Y) { M [I] .X] [A [I] .Y] ++ ; } 他 { A [ ++ CNT] .X = A [I] .X [CNT] .Y = A [I]が.Y; } } のために(INT I = 1。 ;私は= CNT <; Iは++)// 各メモリ点度合 { int型 X = A [I] .X、Y = A [I] .Y; デュ[X] ++;デュ[Y] ++ ; } ため(INT I = 1 ; I <= CNT; Iは++)// 隣接するエッジ自体デポジット点より程度大きい { int型 X = A [I] .X、Yは= [I] .Yと、 IF(DU [X] <= デュ[Y]) { / /このときの初期値は0 wを保存することができるように、それは必要としない add_edge部材(X、Y); } そうadd_edge部材(Y、X); } int型のQ; scanfの(" %のD "、&Q); 一方、(Q - ) { int型のCMD、U、VV; scanfの(" %のD "、&CMD); IF(CMD == 0 ) { scanfの(" %のDの%のD "、&U、&VV); // V [U] + = VV; 用(int型 I =ヘッド[U]; I; I = E [I] .next)// ポイント自体より反復度大きい { W [E [I] .TO] + VV * M = [U] [E [I] .TO]; // 比較的小さな程度iが直接加工点であるUである } } 他 { scanfの(" %のD "、&U); int型 SUM = 0 ; のための(int型 I =ヘッド[U]; I。 = I E [I] .next) { SUM + V = [E [I] .TO] * M [U] [E [I] .TO]; // 近傍点自体のエネルギー値より大きい反復度 } int型 ANS = 0 ; ANS =和+ W [U]。 printf(" %d個の\ n " 、ANS)。 } } } 戻り 0 。 }