亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? critical.c

?? 該文件夾中包含了大部分經典的算法的源程序代碼
?? C
字號:
/* file name: critical.c */
/*如何找出關鍵路徑*/

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

#define MAX_V  100    /*最大節點數*/
#define MAX(x,y) (x < y ) ? y : x
#define MIN(x,y) (x > y ) ? y : x
#define empty -1

/*鄰接節點數據結構*/
typedef struct node_tag {
	int vertex;
	int duration;
	struct node_tag *link;
}  Node;

/*鄰接表頭數據結構*/
typedef struct headnode_tag {
	int count;
	Node *link;
}  HeadNode;

struct Stackstruct {
	int top;
	int item[MAX_V+1];
};

HeadNode *adjlist1[MAX_V+1];     /*鄰接表*/
HeadNode *adjlist2[MAX_V+1];     /*反鄰接表*/
struct Stackstruct Stack1 = { empty }; 
struct Stackstruct Stack2 = { empty };
int N;   /*頂點總數*/
/*起始頂點,終點頂點,最早及最晚時間*/
int source,sink,ES[MAX_V+1],LC[MAX_V+1];
int CriticalNode[MAX_V+1] ,node_count,path_count;

void initial_ES();
void initial_LC();
void build_adjlist();
void show_adjlist(HeadNode *[]);
void Toplogical_sort( HeadNode *[],int []);
void print_steps(int [],int);
void print_critical_node();
void print_critical_path();
void print_ES_LC();
void print_path_node(Node *,int);
void Push(struct Stackstruct *,int );
int  Pop(struct Stackstruct * );

void main()
{
	build_adjlist();
	show_adjlist(adjlist1);           /*顯示鄰接表*/
	initial_ES();                     /*起始ES(最早時間)*/
	Toplogical_sort(adjlist1,ES);   /*以拓樸排序法求出ES*/
	initial_LC();                     /*起始LC(最晚時間)*/
	show_adjlist(adjlist2);           /*顯示反鄰接表*/
	Toplogical_sort(adjlist2,LC);    /*以拓樸排序法求出LC*/
	print_ES_LC();	 	     /*列出最早及最晚時間*/
	print_critical_node();             /*列出關鍵點*/
	print_critical_path();             /*列出臨路徑*/
}

void build_adjlist()
{
	FILE *fptr;
	int vi,vj,w;
	Node *node;

	fptr = fopen("critical.dat","r");
	if ( fptr == NULL )
	{
		perror("critical.dat");
		exit(1);
	}

	fscanf(fptr,"%d",&N);
	/*起始鄰接表,count為前驅的數目 */
	for ( vi = 1; vi <= N; vi++)
	{
		adjlist1[vi] = (HeadNode *)malloc(sizeof(HeadNode));
		adjlist2[vi] = (HeadNode *)malloc(sizeof(HeadNode));
		adjlist1[vi]->count = 0;
		adjlist2[vi]->count = 0;
		adjlist1[vi]->link = NULL;
		adjlist2[vi]->link = NULL;
	}

	/* 讀取vi到vj的權w(duration)并串至鄰接表及反鄰接表 */
	while( fscanf(fptr,"%d %d %d",&vi,&vj,&w) !=EOF)
	{
		node = (Node *)malloc(sizeof(Node));
		node->vertex = vj;
		node->duration = w;
		node->link = adjlist1[vi]->link;
		adjlist1[vi]->link = node;
		adjlist1[vj]->count++;      /*前驅數加1*/
		node = (Node *)malloc(sizeof(Node));
		node->vertex = vi;
		node->duration = w;
		node->link = adjlist2[vj]->link;
		adjlist2[vj]->link = node;
		adjlist2[vi]->count++;      /*前驅數加1*/
	}
	fclose(fptr);

	/*找出開始頂點*/
	for (vi =1; vi <= N; vi++ )
		if ( adjlist1[vi]->count == 0 )
		{
			source = vi;
			break;
		}
	/*找出結束結點*/
	for ( vi = 1;vi <= N; vi++ )
		if ( adjlist1[vi]->link == NULL )
		{
			sink = vi;
			break;
		}
}
/*顯示鄰接表函數*/
void show_adjlist(HeadNode *adjlist[])
{
	int v;
	Node *ptr;

	/*判斷為鄰接表adjlist1或反鄰接表adjlist2*/
	if ( adjlist == adjlist1)
		puts("\nThe adjacency lists [adjlist1] of the Graph");
	else
		puts("\n\nThe inverse adjaccny list [adjlist2] of the Graph");
	puts("Headnodes    adjacency nodes");
	puts("  /count        /duration   ");
	puts("------------------------------");
	for (v = 1; v <= N; v++)
	{
		printf("V%d: %d",v,adjlist[v]->count);
		ptr = adjlist[v]->link;
		while ( ptr != NULL )
		{
			printf(" --> V%d(%d)",ptr->vertex,ptr->duration);
			ptr = ptr->link;
		}
		printf("\n");
	}
}

/*以拓樸排序法計算最早時間(ES)及最晚時間(LC)*/
void Toplogical_sort(HeadNode *adjlist[],int ES_LC[])
{
	int vi,vj ,k,dur;
	Node *ptr;

	/*將沒有前驅的頂點推入堆棧*/
	for ( vi = 1; vi <= N; vi++ )
		if ( adjlist[vi]->count == 0 )
			Push(&Stack1,vi);
	print_steps(ES_LC,0);    /*列出堆棧及ES_LC狀況*/
	for ( k=1; k<= N; k++ )
	{
		if (  Stack1.top == empty )
		{
			printf("\nCyclic Path found....\n");
			exit(1);
		}
		/*從堆棧彈出頂點*/ 
		vi = Pop(&Stack1);
		ptr = adjlist[vi]->link;    /*ptr指向vi的鄰接邊表*/
		while ( ptr != NULL )
		{
			vj = ptr->vertex;     /*vj為vi的立即后行者*/
			dur = ptr->duration;  
			adjlist[vj]->count--;   /*vj 前驅數減1*/
			if ( adjlist[vj]->count == 0 )
				Push(&Stack1,vj);
			if ( adjlist == adjlist1 )  /*判斷計算ES或LC*/
				ES_LC[vj] = MAX(ES_LC[vj],ES_LC[vi]+dur);
			else
				ES_LC[vj] = MIN(ES_LC[vj],ES_LC[vi]-dur);
			ptr = ptr->link;
		}
		print_steps(ES_LC,vi);
	}
}

/*顯示目前堆棧狀況及ES或LC值*/
void print_steps(int ES_LC[],int v)
{
	int i;

	if ( v == 0 )
	{
		printf("\nComputation of ES_LC :\n");
		printf("----------------------\n");
		printf("ES_LC[N]  : ");
		for (i = 1;i <= N; i++ ) printf(" [%d]",i);
		printf("     Current Stack");
		printf("\ninitial   :");
	}
	else
		printf("\nPopout V%d :",v);
	for ( i = 1; i <= N; i++ )
		printf(" %3d",ES_LC[i]);
	printf("     ");
	for ( i =0; i <= Stack1.top; i++ )
		printf(" %d,",Stack1.item[i]);
}

/*顯示各頂點的最早時間(ES)及早晚時間(LC)值*/
void print_ES_LC()
{
	int i;

	printf("\n");
	for ( i = 1; i<= N; i++ )
		printf("\nES(%d) = %3d   LC(%d) = %3d ES  - LC = %3d",
					i,ES[i],i,LC[i],ES[i] - LC[i]);
}
/*列出關鍵點*/
void print_critical_node()
{
	int v;

	for ( v =1; v<= N;v++ )
		if ( LC[v] == ES[v] )     /*當LC == ES 時頂點為關鍵點*/
			CriticalNode[++node_count] = v;
	printf("\n\nThe Critical Nodes of the Graph :\n");
	for ( v = 1; v<= node_count; v++ )
		printf("%d,",CriticalNode[v]);
}

/*列出界路徑*/
void print_critical_path()
{
	printf("\n\nThe Critical Paths of the Graph :");
	/*從起始頂點開始找尋關鍵路徑*/
	print_path_node(adjlist1[source]->link,source);
}

void print_path_node(Node *ptr,int v)
{
	int  i;

	/* 判斷鄰接頂點是否為關鍵點,將關鍵點推入堆棧
  并從該關鍵點繼續遞歸呼叫print_path_node() */
	while ( ptr != NULL )
	{
		for ( i = 1;i<= node_count;i++)
			if ( CriticalNode[i] == ptr->vertex && LC[ptr->vertex]-LC[v] == ptr->duration )
			{
				Push(&Stack1,(int)ptr);
				Push(&Stack2,v);
				v = ptr->vertex;
				ptr = adjlist1[v]->link;
				print_path_node(ptr,v);
			}
		ptr = ptr->link;
	}

	if ( v == source )
	{
		printf("\n\nThere are %d Critical paths from %d to %d\n",
				path_count,source,sink);
		exit(0);
	}
	/* 當到達終點節點時即找到一關鍵路徑 */
   /* 列出堆棧Stack1所存放的關鍵點
   及Stack2所存放的關鍵活動        */
	if ( v == sink )
	{
		printf("\n");
		for ( i = 0;i <= Stack2.top; i++)
		{
			v = Stack2.item[i];
			ptr =(Node *) Stack1.item[i];
			printf("V%d--%d-->",v,ptr->duration);
		}
		printf("V%d",sink);
		path_count++;
	}

	/* 彈出堆棧中的前一層關鍵頂點及關鍵活動 */
/* 繼續搜索其鄰接頂點是否有關鍵路徑 */ 
	ptr = (Node *)Pop(&Stack1);
	ptr = ptr->link;
	v = Pop(&Stack2);
	print_path_node(ptr,v);
}

/*起始ES初值*/
void initial_ES()
{
	int i;
	for ( i = 1;i <= N; i++ ) ES[i] = 0;
}

/*起始LC初值,LC初值為ES最大值*/
void initial_LC()
{
	int i ,max = 0;
	for ( i = 1; i <= N; i++ ) max= MAX(max,ES[i]);
	for ( i = 1; i <= N; i++ ) LC[i] = max;
}

void Push( struct Stackstruct *stack,int value )
{
	if ( stack->top >= MAX_V)
	{
		printf("Stack is Overflow!!\n");
		exit(1);
	}
	else
		stack->item[++stack->top] = value;
}

int Pop(struct Stackstruct *stack)
{
	if ( stack->top == empty )
	{
		printf("Stack is empty!!");
		exit(1);
	}
	else
		return (stack->item[stack->top--]);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡一卡二卡三乱码免费网站| 成人欧美一区二区三区白人 | 亚洲亚洲人成综合网络| 久久久久久亚洲综合影院红桃| 欧美大白屁股肥臀xxxxxx| 欧美日韩一区国产| 91麻豆精品国产自产在线| 在线播放91灌醉迷j高跟美女| 欧美日韩国产免费一区二区| 欧美精品久久99久久在免费线| 欧美精品日韩综合在线| 欧美一区二区三区的| 精品国产一区二区在线观看| 久久老女人爱爱| 国产精品嫩草久久久久| 亚洲欧美电影一区二区| 亚洲二区视频在线| 日本怡春院一区二区| 看片的网站亚洲| 粉嫩嫩av羞羞动漫久久久| 国产盗摄一区二区| 色婷婷国产精品| 欧美精品v日韩精品v韩国精品v| 欧美一区二区三区免费在线看| 亚洲精品在线三区| 亚洲欧美在线aaa| 婷婷国产v国产偷v亚洲高清| 国产资源精品在线观看| 91影院在线免费观看| 欧美日韩高清在线播放| 国产偷国产偷精品高清尤物| 一区二区三区色| 黄色日韩网站视频| 色婷婷国产精品综合在线观看| 日韩区在线观看| 亚洲三级久久久| 久久精品国产秦先生| av亚洲精华国产精华精华| 91精品国产综合久久精品麻豆 | 在线亚洲高清视频| 日韩欧美国产综合一区| 国产精品对白交换视频| 青娱乐精品在线视频| 91啪亚洲精品| 久久毛片高清国产| 日本欧美一区二区三区乱码| 99久免费精品视频在线观看| 欧美zozo另类异族| 午夜视频在线观看一区二区三区| 国产**成人网毛片九色| 91精品国产手机| 一区二区三区日本| 成人看片黄a免费看在线| 日韩免费观看高清完整版在线观看| 亚洲视频在线观看一区| 国产91精品久久久久久久网曝门| 51精品秘密在线观看| 亚洲与欧洲av电影| 亚洲国产成人tv| 91国产成人在线| 蜜桃免费网站一区二区三区| 国产精品午夜春色av| 欧美在线一二三| 黄色小说综合网站| 亚洲色图制服丝袜| 亚洲精品一卡二卡| 国产精品123| 久久久久久久综合色一本| 麻豆精品在线视频| 91麻豆精品国产| 蜜桃久久久久久| 日韩欧美国产综合| 韩国三级中文字幕hd久久精品| 欧美卡1卡2卡| 日韩精品91亚洲二区在线观看| 日本精品视频一区二区三区| 亚洲欧美日本韩国| 色婷婷久久久亚洲一区二区三区| 综合久久久久久| 色哟哟在线观看一区二区三区| 亚洲欧洲www| 日本一道高清亚洲日美韩| 日韩精品影音先锋| 欧美综合视频在线观看| 国产成人8x视频一区二区| 精品福利一区二区三区| 天堂一区二区在线免费观看| 欧美日韩精品免费观看视频| 成人丝袜高跟foot| 亚洲一区二区三区四区五区中文 | 午夜视频一区在线观看| 国产精品女同一区二区三区| 日韩午夜av电影| 在线国产电影不卡| jlzzjlzz欧美大全| 国产乱码精品一品二品| 日本女人一区二区三区| 一区二区三区精密机械公司| 中文字幕一区二区三区蜜月| 久久久综合网站| 欧美一区欧美二区| 欧美日本一道本在线视频| 色婷婷综合久色| 一本色道**综合亚洲精品蜜桃冫| 国产精品888| 国产传媒一区在线| 国产精品久久久久影院老司| 国产高清精品在线| 一区二区欧美国产| 久久夜色精品国产欧美乱极品| 99热精品国产| 麻豆视频一区二区| 亚洲日本青草视频在线怡红院| 91精品在线免费观看| av中文字幕一区| 美女性感视频久久| 亚洲免费高清视频在线| 欧美大片日本大片免费观看| 99视频热这里只有精品免费| 男人的j进女人的j一区| √…a在线天堂一区| 9191精品国产综合久久久久久| 国产91精品精华液一区二区三区 | 视频一区国产视频| 日韩精品三区四区| 久久福利资源站| 国产一区二区免费看| 国产成人a级片| 欧美揉bbbbb揉bbbbb| 99视频精品在线| 国产成人精品免费一区二区| 日韩精品亚洲专区| 一区二区三区丝袜| 国产精品短视频| 国产日韩欧美激情| 精品国产乱码久久久久久牛牛| 欧美日韩美女一区二区| 色偷偷久久人人79超碰人人澡| 国产精品综合一区二区三区| 秋霞电影一区二区| 午夜精品123| 亚洲国产综合人成综合网站| 一区二区三区四区亚洲| 中文字幕在线播放不卡一区| 国产日产欧美一区| 丁香激情综合国产| 91一区在线观看| 日韩一区二区三免费高清| 日本一区二区成人在线| 亚洲欧美电影院| 精品一区二区三区的国产在线播放| 国产精品99久| 欧美日产国产精品| 色婷婷综合久久| 国产成人欧美日韩在线电影| 国产精品1024久久| 成人亚洲精品久久久久软件| 成人性视频网站| av电影在线观看完整版一区二区| 9久草视频在线视频精品| 国产成人av电影在线播放| 国产91在线看| 91在线观看污| 欧美主播一区二区三区美女| 欧美日韩中文另类| 日韩亚洲电影在线| 精品国产乱码久久久久久蜜臀| 久久中文娱乐网| 国产精品麻豆视频| 伊人性伊人情综合网| 天堂久久久久va久久久久| 捆绑紧缚一区二区三区视频| 中文字幕中文字幕一区二区| 一区二区三区在线播放| 国产毛片一区二区| 日韩一区二区不卡| 国产日韩亚洲欧美综合| 日韩欧美三级在线| 欧美经典一区二区三区| 亚洲精品久久久蜜桃| 日韩黄色片在线观看| 国产精品亚洲一区二区三区在线 | 亚洲四区在线观看| 婷婷国产v国产偷v亚洲高清| 国产综合成人久久大片91| 成人网男人的天堂| 欧美日韩精品系列| 久久精品亚洲国产奇米99| 亚洲蜜臀av乱码久久精品| 蜜桃av噜噜一区| caoporen国产精品视频| 91精品国产91久久久久久一区二区 | 9i看片成人免费高清| 欧美日韩国产大片| 国产精品高潮久久久久无| 日本欧美肥老太交大片| 91美女片黄在线观看| 精品国产91亚洲一区二区三区婷婷| 亚洲精品老司机| 国产福利不卡视频|