08-图8 How Long Does It Take

原题:

Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.
Input Specification:

Each input file contains one test case. Each case starts with a line containing two positive integers N (≤100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N−1), and M, the number of activities. Then M lines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i], E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space.
Output Specification:

For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output "Impossible".
Sample Input 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
Sample Output 1:

18
Sample Input 2:

4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5
Sample Output 2:

Impossible
作者: 陈越
单位: 浙江大学
时间限制: 400ms
内存限制: 64MB
代码长度限制: 16KB

思路:

一道普通的AOE网的题,求关键路径。用临接表实现。

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXV 101
struct edge
{
    int w; //权
    int v; //指向的点
};
vector<edge> G[MAXV];       //临接表
int N,M,inDegree[MAXV]={0},ve[MAXV]={0};    //顶点数,边数,入度

int topoSort()
{
    int num=0;      //入队次数
    queue<int> q;
    for(int i=0;i<N;i++)
    {
        if(inDegree[i]==0)
            q.push(i);          //将度为0的结点入队
    }
    while(!q.empty())
    {
        int u=q.front();      //取出队首结点
        //cout<<u<<endl;
        q.pop();

        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i].v;
            inDegree[v]--;     //入度减1
            if(inDegree[v]==0)
                q.push(v);     //入队
            if(ve[u]+G[u][i].w>ve[v]){
                ve[v]=ve[u]+G[u][i].w;
            }
        }
        G[u].clear();        //清边,非必需
        num++;
    }
    if(num == N)
        return 1;
    else
        return 0;
}

int main()
{
    cin>>N;
    cin>>M;
    for(int i=0;i<M;i++)
    {
        int e,s,l;
        cin>>e;
        cin>>s;
        cin>>l;
        edge temp={l,s};
        G[e].push_back(temp);
        inDegree[s]++;
    }
    if(1==topoSort())
        {
            int max=0;
            for(int i=0;i<N;i++)
            {
                if(ve[i]>max)
                    max=ve[i];
            }
            cout<<max;
        }
    else
        cout<<"Impossible";
    return 0;
}
上一篇:游戏AI(二)—行为树优化之


下一篇:jQuery对象与dom对象的转换