中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 综合其他 > 算法设计
AOV工程网络图的计算
作者:idler 时间:2002-01-05 11:59 出处:互联网 责编:chinaitpower
              摘要:AOV工程网络图的计算

下面是计算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为末事项。


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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有