ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构课程设计2022夏7-2 关键路径

2022-07-11 20:33:26  阅读:173  来源: 互联网

标签:课程设计 int maxx late ++ edges 2022 数据结构 out


7-2 关键路径

假定一个工程由若干子任务构成,使用一个包含n个顶点、e条边的AOE网表示该工程,顶点编号为1至n,有向边表示该工程的每个子任务,边的权值表示完成该子任务所需的时间,假定网中只含一个源点和一个汇点。请编写程序求出该工程的所有关键活动,并计算完成该工程所需的最短时间。

输入格式:

每个测试点包含多组测试数据。每组数据第一行为2个整数n和e,均不超过200,分别表示AOE网的顶点数和边数。接下来e行表示每条边的信息,每行为3个正整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并不一定按端点编号顺序排列,且各顶点并不一定按拓扑序排列。

输出格式:

对每组数据,若工程不可行(AOE网中存在环),输出“unworkable project”;若工程可行,则输出第一行为完成工程所需的最短时间,并从第2行开始输出关键活动,每个关键活动占一行,格式为i->j,其中i和j表示关键活动所在边的端点编号。各关键活动输出顺序为:按i的递增顺序输出,若多个关键活动的i值相同,则按j的递增顺序输出。

输入样例:

4 4
1 2 6
1 3 4
2 4 1
3 4 1
 

输出样例:

7
1->2
2->4
  代码长度限制 16 KB 时间限制 100 ms 内存限制 64 MB
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
#define maxx 200
#define INF 10000
int edges[maxx][maxx];
int in[maxx] = { 0 };
int out[maxx] = { 0 };
int early[maxx] = { 0 };
int late[maxx];
int max1[1]={0};
int s[maxx]={0};
int ne, nv;
int l=0;
int temp1=0;
int earlytime()
{
    int cnt = 0;
    queue<int>qu;
    for (int i = 1; i <= nv; i++)
    {
        if (in[i] == 0)
            qu.push(i); 
    }
    while (!qu.empty())
    {
        int temp = qu.front();
        cnt++;
        qu.pop();
        for (int i = 1; i <= nv; i++)
        {
            if (edges[temp][i] != INF)
            {
                in[i]--;

                early[i] = max(early[i], early[temp] + edges[temp][i]);
                if (in[i] == 0)qu.push(i);
            }
        
        }
    
    }
    if (cnt != nv)
        return -1; 
    else
    {
        int amount = -999;
        for (int i = 1; i <= nv; i++)
        {
            if (early[i] > amount)
                amount = early[i];
        }
        return amount; 
    }


}

void latetime(int count)
{
    queue<int>qu;
    for (int i = 1; i <= nv; i++)
    {
        if (out[i] == 0)
        {
            qu.push(i);
            late[i] = count;
        }
    }
    while (!qu.empty())
    {
        int temp = qu.front();
        qu.pop();
        for (int i = nv; i >=1; i--) 
        {
            if (edges[i][temp] != INF)//edges[i][temp] 
            {
                out[i]--;
                late[i] = min(late[i], late[temp] - edges[i][temp]);

                if (out[i] == 0)
                    qu.push(i);
            }
        }
    }




}

int main()
{
    int n, m;
    while(cin >> n >> m){
        nv = n;
        ne = m;
        memset(in,0,sizeof in);
        memset(out,0,sizeof out);
        memset(early,0,sizeof early);
        memset(late,0,sizeof late);
        memset(s,0,sizeof s);
        
        for (int i = 0; i < maxx; i++)
        {
            late[i] = INF;
            for (int j = 0; j < maxx; j++)
            {
                edges[i][j] = INF;
                
            }
        }
    
        for (int i = 1; i <= ne; i++)
        {
            int a, b, c;
            cin >> a >> b >> c;
            edges[a][b] = c;
            in[b]++;
            out[a]++;
        }
        int count = earlytime();
        if (count == -1)
        {
            cout << "unworkable project"<<endl;
            continue;
        }
        latetime(count);
        cout << count << endl;
        for (int i = 1; i <= nv; i++) 
        {
            for (int j = nv; j >= 1; j--) 
            {
                if (edges[i][j] != INF&&late[j] - early[i]==edges[i][j])
                { s[2*l]=i;
                    s[2*l+1]=j;
                    ++l;
                    
                    max1[0]++;
                    
                }
    
            }
        }
      
      for(int k =0;k<max1[0];k++){
          if(s[2*k]==s[2*k+2]){
              if(s[2*k+1]>s[2*k+3]){
                  temp1=s[2*k+1];
                  s[2*k+1]=s[2*k+3];
                  s[2*k+3]=temp1;
              }
          }
          
         
      }
         for(int k=0;k<max1[0];k++){
              cout<<s[2*k]<<"->"<<s[2*k+1]<<endl;
          }
    }
}

 

标签:课程设计,int,maxx,late,++,edges,2022,数据结构,out
来源: https://www.cnblogs.com/rongzhang/p/16467756.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有