DAGトポロジー+ DP雑用(ロス・バレーP1113)

家事

牛を搾乳する前に、ジョンの農場は、家事のそれぞれがそれを完了するためにいくつかの時間を必要とし、完了するために家事をたくさん持っています。例えば:彼らは一緒に牛をしたい、彼らは牛のためのブルペン、乳房、およびその他の清掃作業に駆動されます。できるだけ早くすべての家事を完了するために、彼らはより多くのミルクを絞るために多くの時間を与えるために、必要です。もちろん、いくつかの雑用が行われ、他の例の雑用で行うことにします。たとえば:ブルペンにherdedだけ牛は同様に洗浄されていない乳房搾乳牛ができない前に、それのために胸を清掃開始します。私たちは、仕事は準備のこの作業を完了したと呼ばれます。少なくとも一つの雑用が準備を必要としない、これは雑用が1というラベル、作業を完了するための最も早い開始かもしれません。Nジョン家事のリストが行われる必要があり、このリストは、特定の順序で、家事のK(K> 1)は、K-1をする時月家事1を操作することが意図されています。

プログラムを書くことは、各作業の雑用の1からnまでの手順から読み取ります。すべての雑用の最短時間を計算が行われます。もちろん、お互いの家事への関係は、彼らが同時に動作することはできません、あなたはジョンの農場労働者が同時に作業の任意の数を完了するために、より十分に持っていると仮定することができます。

入力形式

行1:整数nは、完了する家事の数(3≤n≤10,000)。

第二のライン(N + 1)まで:N行はそれぞれ、各行がスペースで区切られた整数の数を有する、があります。

  • ジョブ番号(N 1は、入力ファイルで順序付けられています)。

  • 作業が完了するまでの時間は、(1≤len≤100)lenは必須です。

  • いくつかの準備作業は、デジタル0で終了していない100以上の合計を、完了する必要があります。いくつかの雑用は、余分なスペースが表示されないだけで、単一の0、入力ファイル全体を記述する作業に準備する必要はありません。

出力フォーマット

最小時間を表す整数は、すべての雑用を完了するために必要。


図は、最終的に0の最大値は、それぞれの層のために計算されとり、DFS各層の考え始めは直接的です。

、イベントAは、イベントBに、C、Dではない同じレベルに依存するので、アイデアは明らかに間違っている場合、間違ったが、単一のイベントで複数のイベントに依存してもよいです

入力サンプルは、依存関係あなたを伝えるため、慎重に検討、あなたはこれがDAGの裸DPタイトルがわかります、あなたはトポロジができない、トポロジーを見ることができます。

コード:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=1000010;
const int M=2000100;
const int mod=10007;
int n,ans,dp[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int p,len;
		scanf("%d%d",&p,&len);
		int t=0;
		while(1){
			int q;
			scanf("%d",&q);
			if(q==0) break;
			t=max(dp[q],t);
		}
		dp[p]=t+len;
		ans=max(ans,dp[p]);
	}
	cout<<ans<<endl; 
	return 0;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105118128