AOV工程网络图的计算

算法 专栏收录该内容
2 篇文章 0 订阅

下面是计算AOV工程网络图的C代码,符合ANSI标准,可用于大部分的编译器。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#define MAX_V_NUM   1024   // 最大顶点数
#define WORD32    unsigned long
#define WORD32_BLEN   4
#define MAX_WORD32   0xffffffffL
#define INIT_AOV   memset( (void *)&g_aov, (char)0xff, (size_t)MAX_V_NUM * MAX_V_NUM * WORD32_BLEN )
#define IN_FILE_NAME  "aov.in"
#define ERR_FILE_NOT_FOUND 1
#define TRUE    1


WORD32 g_aov[MAX_V_NUM][MAX_V_NUM];
WORD32 g_e[MAX_V_NUM], g_l[MAX_V_NUM];
int g_n;


// 函数预定义 -- 开始
void input_init();
void calc_el();
void print_result();
// 函数预定义 -- 结束


void input_init()
{
 WORD32 i, j, k;
 FILE *fp_in;


 INIT_AOV;


 fp_in = fopen( IN_FILE_NAME, "r" );
 if ( fp_in == NULL )
 {
  printf("File not found!/n");
  exit(ERR_FILE_NOT_FOUND);
 }
 fscanf( fp_in, "%d/n", &g_n );
 while (TRUE)
 {
  fscanf( fp_in, "%lu %lu %lu", &i, &j, &k );
  if ( ( i == 0 ) && ( j == 0 ) && ( k == 0 ) ) break;
  g_aov[i - 1][j - 1] = k;
  fscanf( fp_in, "/n" );
 }
 fclose(fp_in);


 g_e[0] = 0;
}


void calc_el()
{
 WORD32 ext;
 int i, j;


 for ( i = 1; i < g_n; i++ )
 {
  ext = 0;
  for ( j = 0; j < g_n; j++ )
   if ( ( g_aov[j][i] != MAX_WORD32 ) && ( g_e[j] + g_aov[j][i] > ext ) )
    ext = g_e[j] + g_aov[j][i];
  g_e[i] = ext;
 }


 g_l[g_n - 1] = g_e[g_n - 1];
 for ( i = g_n - 2; i >= 0; i-- )
 {
  ext = MAX_WORD32;
  for ( j = 0; j < g_n; j++ )
   if ( ( g_aov[i][j] != MAX_WORD32 ) && ( g_l[j] - g_aov[i][j] < ext ) )
    ext = g_l[j] - g_aov[i][j];
  g_l[i] = ext;
 }
}


void print_result()
{
 int i, j;


 printf("  #/tE/t/tL/n");
 for ( i = 0; i < g_n; i++ )
 {
  if ( g_e[i] == g_l[i] )
   printf("*");
  else
   printf(" ");
  printf( " %d/t%lu/t/t%lu/n", i + 1, g_e[i], g_l[i] );
 }
 printf("/n关键路径:/n");
 j = 0;
 while ( j != g_n - 1 )
 {
  printf( "%d - ", j + 1 );
  for ( i = 0; i < g_n; i++ )
  {
   if ( ( g_aov[j][i] != MAX_WORD32 ) && ( g_e[i] == g_l[i] ) )
   {
    j = i;
    break;
   }
  }
 }
 printf( "%d/n", j + 1 );
}


int main(int argc,char *argv[])
{
 input_init();
 calc_el();
 print_result();


 return 0;
}


输入文件aov.in的格式是这样的:


第一行:n,表示顶点数


后面每行表示一道工序


最后用0 0 0结束


事项1为起始事项,事项n为末事项。


输出中,有*的是关键路径上的点。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值