グラフ理論、7-差動拘束システム

申し訳ありませんが、グラフ理論の知識は、二日は今より有用である、今日より多くの差異制約をしました。

それはどのような違い拘束システムですか?制約のいくつかを考えると、そしてそこで見つける/各要素の制約の値と一致していない、もちろん、また、特定の値がカウントすることができます。

ところで、このブログを読む前にSPFAアルゴリズムを学ぶために。例:luoguP1993

タイトル効果:次のようにN変数、及びいくつかの比較条件があるが、条件の間のそれぞれの関係が形作られている:> = B + X、 <= B + X または= B、xは定数、Q関係条件場合が矛盾。

差動制約を解析:制約との差がこれを見、そのような> = B + xと、問題を解決するように制約条件の形態である、更新DISのない思想は存在しない[Y] SPFA式であります

DIS [Y] <= DIS [X] + valの[I]?<= B + xはaからbまでの経路を構築することができないがあれば、重み値X、ライン上の最短ラン。作品のビルド側は、すべての権利を理解していない場合

あなたは明確に差拘束システムの構築側を説明し、その絵の下に見ることができます。

この数字を読んだ後、私たちは、差動側の制約の建設の原則を理解しておく必要がありますが、クラス側A> = B + Xにそれを構築する方法はありますか?非常に良好なラン、Bへの数学的変換を行う<= A +( - X)

これでビルドされていませんか?-Xは、からBへの線の長さの側上に構築されました。しかし、この質問は、コールにそれを保持していないか、もう少し難しいが確立されたかどうか?を判断することですか ことではありません

> = B + X <= B + YおよびYは、最短で見て、X <最初A-構築されている>と言うB、-xビルドB->、yとし、Y <X理由でスタート従ってYX <0これは、負のリングになるよう

そうでない場合は、出力YES負のループ、出力NOがある場合は、負のリングの波を宣告spfaを使用できるように、リングで陰性の結果を生成しません確立し、いくつかがあります。コードは以下の通りであります:

<ビット/ STDC ++ H>の#include
 の#define XMS CTE
 の#define INT長い長い
 使用して 名前空間STDを、
const  int型 NR = 10005 ;
const  int型 INF = 1E18 + 10 整数N、M、S。
int型リード()
{ 
    int型のx = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1; CH = GETCHAR();}
     一方(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR( );}
     戻り X * F。
} 
INTに[NR * 3 ]、NXT [NR * 3 ]、ヴァル[NR * 3 ]。
int型のヘッド[NR]。
int型 TOT = 1 ;
ボイド追加(int型のx、int型のy、int型Z)
{ 
    [TOT]へ = Y。
    ヴァル[TOT] = Z; 
    NXT [TOT] = 頭部[X]。
    ヘッド[X] = TOT ++ 
} 
ブールフラグ= 0 int型のDIS [NR]、CNT [NR]。
int型CNT2 [NR]。
BOOL VIS [NR]。
ボイドSPFA()
{ 
    INT iは= 0 ; I <= N; I ++)DIS [I] = - 1E18。
    キュー < 整数 > Q; 
    (S)q.push。
    VIS [S] = 1、DIS [S] = 0 ;
    しばらく(!q.empty())
    {
        int型のx =q.front(); 
        q.pop(); 
//         coutの<< X <<てendl; 
        CNT2 [X] ++ ; 
        VIS [X] = 0 ;
        もし(CNT2 [X]> = N)
        { 
            フラグ = 1 リターン; 
        } 
        ためINT I [x]はヘッド=; I;私は= NXT [I])
        { 
            int型、Y = [I]にします。
            もし(DIS [Y] <DIS [X] + valの[I])
            { 
                
                DIS [Y] = DIS [X] + valの[I]。
                もし(!VIS [Y])
                { 
                    q.push(Y)。
                    VIS [Y] = 1 
                } 
            } 
        } 
    } 
} 
署名されたメイン()
{ 
//     freopenは( "farm.in"、 "R"、STDIN)。
//     freopenは( "farm.out"、 "W"、STDOUT)。
    N = read()は、M = read()は、
    INT iは= 1 ; I <= M I ++ 
    { 
        int型のOP。
        OP = READ()。
        もし(OP == 1 
        { 
            int型 A = read()は、B = read()は、C =)(読み取ります。
            (a、b、c)を加えます。
        }
         であれば(OP == 2 
        { 
            int型 A =読み取る()、B =読み取る()、C = (読み取り)
            追加(B、 - C)。
        }
         であれば(OP == 3 
        { 
            int型 A =読み取る()、B = (読み取り)
            追加(A、B、0 ); 
            (B、追加、0 ); 
        } 
    } 
    のためにINT iは= 1 ; I <= N; I ++)を追加し(0、I、0 ); 
    SPFA(); 
    もし(!フラグ)プット( " はい" )。
    他のプット(ノー)。
    リターン 0 ; 
}

あなたはロス・バレー、またはspfaのロス・カードBFSバージョンの谷のO2最適化の提出を開かなければならないことに注意してください

 

その後、差動制約に基づいて終了し、現在は先進のいくつかの点で好ましいです。

あなたはこの制約はそれほど簡単ではないことが判明した場合どのようにそれを行うには?POJ1275:私は一つの質問をお勧めしてみましょう

タイトル効果: 24時間スーパーマーケットが毎時、あるは、の最小値を必要とする[I]の従業員、存在するN(N <= 1000)候補者は、一人一人は、パラメータxを有し、最初のx 8時間後から表します

この人は、働く多くの人が要件を満たすために雇っているか尋ねることができます。満たされていない場合は、出力Noソリューション。

トピック分析:この質問は、違いがそのにより拘束されていない場合、非常にああと思ったことを言っているわけではありませんか?この質問は、どのように差動制約もありますか?ノードが最初であるかを判断して、何かを考えるように。私たちは、の配列を使用します

当日I S上で容易に利用可能なすべての[i]を-s [I-8]> [i]は、しかし、ときに私<7、三意志を=まで接頭辞を表し、S [i]には、労働者の数を表し、不平等、この問題を解決するために、我々はできます

Sの小品[23]、およびI <7は、その行にspfaを行う二者不平等になります。私はあなたが自分自身についてのコード、書き込み時にこの質問を見ていないことを示唆しています。

しかし、私は今ここにコードを置きます

 

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
const int型NR = 105; 
= 2E3 + 10のconst int型MR。
int型のn; 
[NR]、NUMをINT [NR]。
[MR]、NXT [MR]、valの[MR]にint型。
int型のヘッド[NR]。
int型TOT = 1; 
ボイド追加(int型のx、int型のy、int型Z)
{ 
	[TOT]へ= Y。
	ヴァル[TOT = Z。
	NXT [TOT =頭部[X]。
	ヘッド[X] = TOT ++。
} 
int型リード()
{ 
	int型のx = 0、F = 1; CHAR CH = GETCHAR()。
	一方、(CH> '9' || CH < '0'){IF(CH == ' - ')= -1 F; CH = GETCHAR();} 
	(CH <= '9' && CHつつ> = '0 「){X =(x << 3)+(X << 1)+(CH ^ 48)、CH = GETCHAR();} 
	戻りX * F。
} 
BOOL VIS [NR]。
int型のDIS [NR]。
	memsetの(頭、0、はsizeof(ヘッド))。
	memsetの(VIS、0、はsizeof(VIS))。
	memset(DIS、-0x3f、はsizeof(DIS))。
} 
ボイドビルド(int型X)
{ 
	(INT iが0 = I ++; I <= 23)についての
	{ 
		(I + 1,0、i)を加えます。
		(I + 1、I、-num [I])を追加します。
	} 
	ため(INT iが7 =; I <= 23; I ++)を追加し(I-7、I + 1、[I])。
	(24.0、-x)を追加し、(0,24、x)を追加します。
	用(INT iは= 0; I <= 6; I ++)(I + 17、I + 1、[I] -x)を追加し、
} 
BOOLチェック(int型X)
{ 
	初期化()。
	ビルド(x)は、
	キュー<整数> Q; 
	q.push(0)、DIS [0] = 0、VIS [0] = 1; 
	(!q.empty())、一方
	{ 
		INT今= q.front(); q.pop(); VIS [今] = 0; 
		(今== 24の&& DIS [今]> x)は0を返す場合、
		以下のために(INT iが[今]ヘッド=; iが、iがNXTを[I] =)
		{ 
			int型、Y =乃至[I]。
			IF(DIS [Y] <DIS [今] +ヴァル[I])
			{ 
				DIS [Y] = DIS [今] +ヴァル[I]。
				IF(VIS [Y]!)
				{ 
					q.push(Y)。
					VIS [Y] = 1。
				} 
			} 
		} 
	} 
	[24] == X DISを返します。
} 
ボイド解く()
{ 
	int型ANS = -1。
	以下のために(INT I 0 =; I <= N; I ++)
	{ 
		IF(チェック(I))
		{ 
			ANS = I。
			ブレーク; 
		} 
	} 
	もし(ANS <0)プット( "いいえソリューション")。
	他のprintf( "%d個\ n"は、ANS)。
} 
int型のmain()
{ 
// freopenは( "1.in"、 "R"、標準入力)。
// freopenは( "1.out"、 "W"、
	INT T =読み取ります()。
	一方、(T--)
	{ 
		memsetの(NUM、0、
		以下のために(INT I 0 =; I <= 23; I ++)
		{ 
			[I] =)(読み取ります。
		} 
		N =)(読み取ります。
		以下のために(INT I 1 =; I <= N; I ++)
		{ 
			int型X =)(読み取ります。
			NUM [X] ++; 
		} 
		)(解きます。
	} 
	0を返します。
}

 

  

 

おすすめ

転載: www.cnblogs.com/chen-1/p/12608187.html