ラダーマッチ練習--7-15ロングんが、それは(25ポイント)を取る方法(クリティカルパス+トポロジカル整列)

トピック:

ここに画像を挿入説明

分析:

トポロジカルソートは、プロジェクトを完了するかどうかを決定することは、プロジェクト、プロジェクトを完了するために必要な必要な最大時間を完了することができれば、(すなわち、ループが存在するか否かを判断する)、それが最大の時刻n-1がこの時点では必ずしもないことは注目に値するができた、ありますn-1の任意の点に0は、前回のサイクルタイムは、最長時間を見つけるために必要。

コード:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

const int MAXN = 105;
int n,m;
int ve[MAXN],inDegree[MAXN];
int mat[MAXN][MAXN];
queue<int> q;

bool Topological()
{
    int cnt = 0;
    for(int i=0;i<n;++i)
        if(inDegree[i]==0)
            q.push(i);
    while(!q.empty())
    {
        int now = q.front();
        cnt++;
        q.pop();
        for(int i=0;i<n;++i)
        {
            if(mat[now][i]!=INF)
            {
                inDegree[i]--;
                if(inDegree[i] == 0)
                    q.push(i);
                if(ve[now]+mat[now][i] > ve[i])
                    ve[i] = ve[now] + mat[now][i];
            }
        }
    }
    if(cnt == n) return true;
    else return false;
}

int main()
{
    scanf("%d%d",&n,&m);
    int st,ed,ti;
    memset(mat,INF,sizeof(mat));
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&st,&ed,&ti);
        mat[st][ed] = ti;
        inDegree[ed]++;
    }
    bool flag = Topological();
    int ans = 0;
    if(!flag)
        printf("Impossible\n");
    else
    {
        for(int i=0;i<n;++i)
            ans = max(ans,ve[i]);
        printf("%d\n",ans);
    }
    return 0;
}

公開された61元の記事 ウォン称賛7 ビュー3619

おすすめ

転載: blog.csdn.net/weixin_42469716/article/details/105149604