BZOJ 4500マトリックス

これは、トピックに行うには、グラフ理論ですが、数学的分析とACに逮捕することができます。

数学:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
長い長いT; 
長い長いM、N、K。
長い長いS [1111] [1111]。
長い長いCNT [1111] [1111]。
構造体ノード{ 
	長い長いX、Y、W。
} V [1111]。
ブールCMP(ノードA、ノードB){ 
	IF(AX == BX){ 
		戻りAY <によって、
	}他{ 
		戻りAX <BX。
	} 
} 
int型のmain(){ 
	CIN >> T。
	一方、(T - ){ 
		memsetの(S、0、はsizeof(S))。
		memset(CNT、0、はsizeof(CNT))。
		scanf関数( "%D%D%D"、&M、&N&K)。
		BOOL TMP = 0。
		{(;私は= Kを<I ++が長い長いI = 1)のため
			のscanf( "%D%D%D"、&V [i]は.X、&V [i]は.Y、&V [i]は.W)。
			(![V [i]を.X] [V [i]のCNT場合。
				S [V [i]は.X] [V [i]は.Y] = V [i]は.W。
				CNT [V [i]は.X] [Vの[I] .Y] = 1。
			}他{ 
				IF(S [V [i]は.X] [V [i]は.Y] = V [i]は.W!){ 
					TMP = 1。
				} 
			} 
		} 
		ソート(V + 1、V + K + 1、CMP)。
		ブールFG = 0。
		{(; <= K ++長い長= 1)の
			ための(長い長B = A + 1、B <= K; B ++){ 
				; C <= K、C ++(長い長いC = B + 1のために){ 
					IF(V [A] .X == V [B] .X && V [A] .Y == V [C] .Y){ 
						長い長いXX = V [C] .X。
						長い長いYY = V [B] .Y。
						IF(CNT [XX] [YY]){ 
							IF((V [A] .W + V [B] .W + V [C] .W + S [XX] [YY])%2!= 0){ 
								FG = 1。
								ブレーク; 
							} 
						} 
					} 
				} 
			} 
		}
		(!FG && TMP){もし
			プット( "はい")。
		}他{
			プット( "いいえ"); 
		} 
	} 
	0を返します。
}

  

グラフ理論:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
typedefの長い長いLL。
LLのT、M、N、K。
[2100012]にLLヘッド[2100012]は、、、ヴァル[2100012]、LENを[2100012]を事前。
LL DIS [2100012]、NXT [2100012]。
VISブール[2100012]。
ボイドインサート(LL U、LLをV、W LL){ 
	[++ LEN]へ= V。
	ヴァル[lenは、Wが=。
	プレ[LEN =頭部[U]。
	ヘッド[U] = LEN。
} 
ブールXY(){ 
	キュー<LL> PQ。
	memset(DIS、0x3f3f3f3f、はsizeof(DIS))。
	memsetの(VIS、0、はsizeof(VIS))。
	memset(NXT、0、はsizeof(NXT))。
	DIS [0] = 0; 
	VIS [0] = 1。
	pq.push(0)。
	(!pq.empty()){中
		)(今= pq.frontっ。
		pq.pop(); 
		{(I =プレ[I]; iがLL I =ヘッド[今])のために
			NEX LL = [I]であり;
			{IF([今] +ヴァル[I] DIS [NEX]> DIS)
				DIS [NEX = DIS [今] +ヴァル[I]。
				NXT [NEX = NXT [今] +1。
				(NXT [NEX]> = M + N + 1){場合に
					falseを返します。
				} 
				(!VIS [NEX]){もし
					VIS [NEX] = TRUE; 
					pq.push(NEX)。
				} 
			} 
		} 
		VIS [今] = FALSE; 
	} 
	trueを返します。
} 
int型のmain(){ 
	scanf関数( "%のLLD"、&T)。
	{ - (T)一方
		、scanf関数( "%LLD%LLD%LLD"、&M、&N&K)
		memsetの(頭、0、はsizeof(ヘッド))。
		memset(0、に、はsizeof()へ)。
		memsetの(前、0、はsizeof(PRE))。
		LEN = 0; 
		用(LL I = 1; I <= M + N; iは++){ 
			(iは0、0)を挿入。
		}
		以下のために(LL i = 1; iが= Kを<; iは++){
			LL X、Y、C。
			scanf関数( "%LLD%LLD%LLD"、およびX&Y、&C)。
			(X、Y + M、c)を挿入します。
			(Y + M、X、-c)を挿入します。
		} 
		IF(XY()){ 
			プット( "はい")。
		}他{ 
			プット(「いいえ」)。
		} 
	} 
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/hazel-wu/p/11284367.html