プロジェクトは複数のタスクで構成され、タスク間の依存順序があります。プロジェクトマネージャは、マイルストーンのシリーズを設定された検査タスクノードの完了の各マイルストーン、およびフォローアップの作業を開始する必要があります。今、与えられたプロジェクトにさまざまなタスク間の関係は、あなたが最初のプロジェクトの完了時間を計算します。
入力フォーマット:
まず、最初の行は2つの正の整数を与える:プロジェクトのマイルストーンの数N(≤100)およびタスクの総数Mを N-1の番号まで、ここで0からマイルストーン。続いてM行は、各列は、所与のタスク、スペースで区切られた負でない整数である3つの数字「タスク持続時間マイルストーンタスクはの端部に向かって作業を開始する」のフォーマットを記述する。
出力フォーマット:
あなたがスケジュールした場合は、プロジェクト全体は、行の早い完了時間の出力が可能である、そうでない場合は、出力「インポッシブル」。
サンプル入力1:
9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4
出力サンプル1:
18
サンプル入力2:
4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5
出力サンプル2:
不可能な
使用隣接マトリックス構築物は、そのノードがノードの総数でない場合は、ソートされていない成功を非巡回グラフ、トポロジカル整列し、最終的にチームへの指示、または回路を持っている...
ついでにブラッシュアップクリティカルパス、最新で初めてテイクの場所を発生時間概念の。
全体イベントの終了時間は最長経路からエンドポイントへの出発点長AOE図であり、このパスは、クリティカルパスと呼ばれます。クリティカルパス上の活動が呼び出され、重要な活動。
クリティカルパスは、必ずしも一つだけではありません。
最も早い発生時刻:バック、前駆ノードへ正面から現在のノードに必要な時間には、最大値をとります。
最新の発生時刻:フロントへ戻る、最新発生時間後継ノード-エッジ重み値、最小値。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<list>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
#define N 109
int mod = 1e9+7,n,m;
#define M 249997
int vis[N];
int edge[N][N];
int degree[N],time1[N];
int main()
{
cin >> n >> m;
int x,y,val,cnt=0;
queue<int> qu;
memset(edge,-1,sizeof(edge));
for(int i=0;i<m;i++){
scanf("%d %d %d",&x,&y,&val);
edge[x][y] = val;
degree[y]++;
}
for(int i=0;i<n;i++){
if(degree[i]==0) {
qu.push(i);
cnt ++;
}
}
while(qu.size()){
int e = qu.front();
qu.pop();
for(int i=0;i<n;i++){
if(edge[e][i]!=-1){
degree[i]--;
if(degree[i]==0) {
qu.push(i);
cnt ++;
}
time1[i] = max(time1[i],time1[e]+edge[e][i]);
}
}
}
// cout << cnt << endl;
if(cnt!=n) cout << "Impossible" << endl;
else {
int ret = 0;
for(int i=0;i<n;i++) ret = max(ret,time1[i]);
cout << ret << endl;
}
return 0;
}