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

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

?? my_hamilton.c

?? 哈密爾頓近似算法的語言實現及旅行商問題的實現
?? C
字號:
/*
  Name: my_hamilton.c
  Copyright: all copyright reserved by rockins
  Author: rockins
  Date: 05-03-06 19:54
  Description: this procedure implements an algorithm for undirected complete hamilton graph
  Note: 
      1.the max dimense size of array is 100
      2.the adjoin-matrix's data is stored in text file,eg,data.txt
      3.the format of data is like this:
            6 4
            1 1 2 1
            2 2 3 2
            3 3 4 3
            4 4 1 4
            5 1 3 5
            6 2 4 6
  Format:edge#,node1,node2,weight
          here the first line means the dimense of the array is 3,and
          following is the real data
  Test result:
      		(abbreviate)
*/

#include <stdio.h>
#include <stdlib.h>
#include "my_hamilton.h"

#ifdef __MY_HAMILTON_DEBUG__
/* feature: print edge info, just for debug */
int PrintEdgeWeightInfo(void)
{
    int	i;
    for (i=1; i<=szEdge; i++)
    {
		printf("edgeNum:%d,node1:%d,node2:%d,weight:%d,deleted:%d\n",
				sqEdgeWeight[i].edgeNum,
				sqEdgeWeight[i].node1,
				sqEdgeWeight[i].node2,
				sqEdgeWeight[i].weight,
    			sqEdgeWeight[i].deleted);
    }
}

/* feature: print edge set S info,just for debugging */
int PrintEdgeWeightSetInfo(void)
{
    int	i;
    for (i=1; i<stIndex; i++)
    {
		printf("edgeNum:%d,node1:%d,node2:%d,weight:%d,deleted:%d\n",
				stEdgeWeight[i].edgeNum,
				stEdgeWeight[i].node1,
				stEdgeWeight[i].node2,
				stEdgeWeight[i].weight,
    			stEdgeWeight[i].deleted);
    }
}

/* feature:print all nodes' degree info */
int PrintDegree(void)
{
    int	i;
    for (i=1; i<=szNode; i++)
    {
        printf("degree of %d:%d\n", i, degree[i]);
    }
}
#endif

/* 	feature: read edge weight data from file
	param: (none)
	retval:	-1,error
			positive value, edge number
*/
int GetInitEdgeWeight(void)
{
    int    i,j;
    FILE   *fp;
    int    n;                   			// edge-weigth array size
#if    defined(__MY_HAMILTON_DEBUG__)
	char   file_name[40]="array2.txt";      	// file path
#elif	defined(__MY_HAMILTON_RELEASE__)
   	char   file_name[40];
    printf("Input the file path:");
    scanf("%s%*c", file_name);         		// read path, but ignore \r(RETURN)
#endif

    fp=fopen(file_name, "r");
    while(fp==NULL)
    {
        printf("cannot open the file,please re-input:");
        scanf("%s%*c", file_name);
        fp=fopen(file_name, "r");
    }
    
    fscanf(fp, "%d", &n);          // first data of first line is the dimense size of matrix
    if (n>N_EDGE)
    {
    	fprintf(stderr, "error: too large graph,please check\n");
    	return(-1);
   	}
   	fscanf(fp, "%d", &szNode);		// second data of first line is node number */
   	if (szNode>N_NODE)
   	{
    	fprintf(stderr, "error: too large graph,please check\n");
    	return(-1);
   	}
#ifdef __MY_HAMILTON_DEBUG__
    printf("in function:%s\n", __func__);
#endif
    for (i=1; i<=n; i++)
    {
        fscanf(fp, "%d", &sqEdgeWeight[i].edgeNum);
        fscanf(fp, "%d", &sqEdgeWeight[i].node1);
        fscanf(fp, "%d", &sqEdgeWeight[i].node2);
        fscanf(fp, "%d", &sqEdgeWeight[i].weight);
        sqEdgeWeight[i].deleted = 0;
#ifdef __MY_HAMILTON_DEBUG__
		printf("edgeNum:%d,node1:%d,node2:%d,weight:%d,deleted:%d\n",
				sqEdgeWeight[i].edgeNum,
				sqEdgeWeight[i].node1,
				sqEdgeWeight[i].node2,
				sqEdgeWeight[i].weight,
    			sqEdgeWeight[i].deleted);
#endif
    }
	return(n);
}    

/*	feature: sort init edge weight sequence, in select sorting algorithm
	param:(none)
	retval:(none)
*/
int SortInitEdgeWeight(void)
{
    int	i, j, k;
    EDGEWEIGHT	tmpEdgeWeight;
    
    for (i=1; i<=szEdge; i++)
    {
        tmpEdgeWeight = sqEdgeWeight[i];
        k = i;
        for (j=i+1; j<=szEdge; j++)
        {
            if (sqEdgeWeight[j].weight<tmpEdgeWeight.weight)
            {
                tmpEdgeWeight = sqEdgeWeight[j];
                k = j;
            }
        }
        if (k != i)
        {
            sqEdgeWeight[k] = sqEdgeWeight[i];
            sqEdgeWeight[i] = tmpEdgeWeight;
        }
    }
#ifdef __MY_HAMILTON_DEBUG__
	printf("in function:%s\n", __func__);
	PrintEdgeWeightInfo();
#endif
}

/*	feature: add edge i of sq to S set,and del from sq
	param: i,the edge i of sq
	retval:(none)
*/
int	AddEdgeToSet(int i)
{
    stEdgeWeight[stIndex] = sqEdgeWeight[i];
    sqEdgeWeight[i].deleted = 1;
    stEdgeWeight[stIndex].deleted = 0;
    stIndex += 1;
    sqIndex = i+1;
#ifdef	__MY_HAMILTON_DEBUG__
	printf("in function:%s\n", __func__);
	printf("sq info:\n");
	PrintEdgeWeightInfo();
	printf("S set info:\n");
	PrintEdgeWeightSetInfo();
#endif
}

/*	feature: check if some vertex's degree is larger than 2
	param:i,the added edge
	retval:1,yes,some vertex's degree is above 2
			0,no,no vertex's degree is above 2
*/
int	IsDegreeAbove2(int i)
{
	int	j;
	int	c;
	
	c = 0;
	for (j=1; j<=i; j++)
	{
     	if ((stEdgeWeight[j].deleted==0) &&
      		((stEdgeWeight[j].node1 == stEdgeWeight[i].node1) ||
     		 (stEdgeWeight[j].node2 == stEdgeWeight[i].node1)))
     		 c += 1;
    }
    if (c > 2)	return(1);

    c = 0;
	for (j=1; j<=i; j++)
	{
     	if ((stEdgeWeight[j].deleted==0) &&
      		((stEdgeWeight[j].node1 == stEdgeWeight[i].node2) ||
     		 (stEdgeWeight[j].node2 == stEdgeWeight[i].node2)))
     		 c += 1;
    }
    if (c > 2)	return(1);
    
    return(0);
}

/*  feature: delete edge i from S set
	param:i,the edge to delete
	retval:(none)
*/
int	DelSetEdge(int i)
{
    stEdgeWeight[i].deleted = 1;
#ifdef	__MY_HAMILTON_DEBUG__
	printf("in function:%s\n", __func__);
	printf("S set info:\n");
	PrintEdgeWeightSetInfo();
#endif
}

/*	feature: count degree of nodes in S set
	param:(none)
	retval:(none)
*/
int	CountDegree(void)
{
    int	i, j, k;
    
    for(i=1; i<=szNode; i++)
    {
        degree[i] = 0;
    }
    
    for (i=1; i<stIndex; i++)
    {
        j = stEdgeWeight[i].node1;
        k = stEdgeWeight[i].node2;
        degree[j] += 1;
        degree[k] += 1;
    }
#ifdef __MY_HAMILTON_DEBUG__
    PrintDegree();
#endif
}

/* feature: check if S set can form a HC
	param:(none)
	retval:1,yes,has a HC
			0,no,no HC
*/
int IsHamiltonCycle(void)
{
    int	i;
    
    CountDegree();
    for (i=1; i<=szNode; i++)
    {
        if (degree[i] != 2)			/* because there's no self-cycle and no-above-3-degree edge,so the judgement is simple */
        	return(0);
   	}
   	return(1);
}

/*   feature: check is S set have local cycle
	param:(none)
	retval:1,yes,has local cycle
			0,no,no local cycle
*/
int	IsLocalCycle(void)
{
    int	i;

    if	(IsHamiltonCycle())	return(0);	/* if is HC,then not local cycle */
    CountDegree();
    for (i=1; i<=szNode; i++)
    {
        if ((degree[i] != 0) || (degree[i] != 2))		/* if has degree which is not 0 or 2,eg,it has degree 1,the surely is not Local cycle */
        	return(0);
   	}
   	return(1);		/* else(not HC && has only two kind degree,0 or 2,then it must be a local cycle */
}

/*	feature: main body of greedy algorithm
	param:(none)
	retval:1,find HC
			0,not find HC
*/
int	GreedySearch(void)
{
    int i, j, k;
    
    for (i=1; i<=szEdge; i++)  	/* STEP 3 */
    {
        AddEdgeToSet(i);
        if (IsDegreeAbove2(i))			/* some vertex's degree larger than 2 */
        {
        	DelSetEdge(i);
        	continue;					/* goto STEP 3 */
       	}else if(IsHamiltonCycle())		/* S contain all vertex,each vertex has 2 degree,and form a cycle */
       	{
       		return(1);					/* find Hamilton cycle,goto STEP 4 */
  		}else if(IsLocalCycle())                 		/* S contain local cycle */
  		{
        	DelSetEdge(i);				/* del edge i from S set */
  		}else
  		{
//        	AddEdgeToSet(i);			/* add edge i to S set,and del it from sq */
//  			if (0)			/* S contain all vertexs,and each's degree is 2,note:here means self-cycle.but in our graph,there's no such problity  */
//  			{
//         		return(0);	/* not exist Hamilton-cycle,goto STEP 5 */
//      		}else
//      		{
//            	return(1);/* find Hamilton-cycle,goto STEP 4 */
//  			}
  		}
    }
    return(0);
}

int	OutputHC(void)
{
    int i, j, k;
    int HC_len = 0;				/* Hamilton-Cycle length */
    
    printf("Hamilton-Cycle path(in edge presentation):\n");
    for(i=1; i<stIndex; i++)
    {
        if(stEdgeWeight[i].deleted == 0)
        {
            printf("%d\t", stEdgeWeight[i].edgeNum);
            HC_len += stEdgeWeight[i].weight;
        }
    }
    
//    j = stEdgeWeight[1].node1;
//    k = stEdgeWeight[1].node2;
//    printf("\nHamilton-Cycle path(in node form):\n");
//    printf("%d", j);
//    while (k != j)
//    {
//        printf(" -> %d ", k);
//        for(i=2; i<stIndex; i++)
//        {
//            if((stEdgeWeight[i].deleted == 0) && (stEdgeWeight[i].node1 == k))
//            {
//                k = stEdgeWeight[i].node2;
//                break;
//            }
//            if((stEdgeWeight[i].deleted == 0) && (stEdgeWeight[i].node2 == k))
//            {
//            	k = stEdgeWeight[i].node1;
//            	break;
//           	}
//        }
//    }
//    printf(" ->%d ", k);

    printf("\nHamilton-Cycle length: %d\n", HC_len);
}
            
int main(void)
{
    szEdge = GetInitEdgeWeight();
    SortInitEdgeWeight();
//    InitEdgeWeightSet();
    if	(GreedySearch())
    {
#ifdef	__MY_HAMILTON_DEBUG__
    	printf("in function:%s\n", __func__);
    	printf("S set info:\n");
    	PrintEdgeWeightSetInfo();
#endif
	}
	OutputHC();
    system("pause");
    return(0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品成人a区在线观看| 亚洲一区二区免费视频| 亚洲欧洲精品一区二区精品久久久| 一区二区三区国产精华| 久久国产尿小便嘘嘘尿| 91蜜桃视频在线| 亚洲精品一区二区三区福利 | 中文字幕五月欧美| 久久激五月天综合精品| 91麻豆高清视频| 久久麻豆一区二区| 日本sm残虐另类| 欧洲av一区二区嗯嗯嗯啊| 国产精品三级av| 国产乱码精品一区二区三| 欧美欧美午夜aⅴ在线观看| 亚洲视频一区在线观看| 国产成人综合自拍| 欧美不卡一区二区| 免费精品99久久国产综合精品| 色88888久久久久久影院野外| 国产午夜精品理论片a级大结局| 日本中文字幕一区二区有限公司| 欧洲国内综合视频| 亚洲精品成a人| 一本大道久久a久久综合婷婷| 国产精品久久久久久久久晋中 | 777亚洲妇女| 曰韩精品一区二区| 91极品视觉盛宴| 亚洲一区二区三区四区的 | 一区二区三区免费网站| 91在线码无精品| 亚洲欧美激情在线| 色婷婷av久久久久久久| 亚洲视频在线一区| 欧美午夜精品久久久久久超碰| 亚洲精品综合在线| 欧洲一区在线观看| 日韩精品视频网站| 日韩一区和二区| 美女在线视频一区| 久久久亚洲欧洲日产国码αv| 国产在线不卡视频| 欧美国产精品中文字幕| 91片黄在线观看| 亚洲精品免费在线播放| 欧美精品电影在线播放| 美美哒免费高清在线观看视频一区二区| 91精品国产麻豆国产自产在线 | 亚洲日本va午夜在线影院| 成人av小说网| 亚洲成av人在线观看| 欧美一级搡bbbb搡bbbb| 国产很黄免费观看久久| 亚洲免费av观看| 欧美精品久久天天躁| 国产一区二区精品久久99| 亚洲欧洲国产日韩| 91麻豆精品国产| 国产精品一区二区在线观看不卡| 亚洲视频免费在线观看| 日韩丝袜情趣美女图片| 丁香婷婷深情五月亚洲| 亚洲国产视频在线| 精品91自产拍在线观看一区| 99久久er热在这里只有精品15| 亚洲福利一区二区| 久久精品免视看| 91久久免费观看| 美女视频一区二区| 亚洲同性同志一二三专区| 91精品国产综合久久精品app| 成人午夜视频福利| 日日骚欧美日韩| 国产精品网曝门| 欧美一区二区视频在线观看2020| 高清成人免费视频| 日韩av不卡一区二区| 亚洲手机成人高清视频| www激情久久| 91国在线观看| av在线一区二区| 国产一区二区视频在线播放| 亚洲一二三四在线| 国产精品久久久久久久浪潮网站| 91精品免费在线观看| 在线观看视频欧美| 成人黄色大片在线观看| 国产一区二区网址| 秋霞午夜鲁丝一区二区老狼| 一区二区三区不卡视频在线观看 | 国产欧美一区二区三区在线看蜜臀| 91传媒视频在线播放| 成人97人人超碰人人99| 久久国产婷婷国产香蕉| 日本欧美加勒比视频| 亚洲综合色视频| 亚洲色图另类专区| 欧美韩国日本不卡| www国产精品av| 日韩欧美一级在线播放| 日韩一区二区三区电影在线观看 | 国产一区91精品张津瑜| 久久99国产精品麻豆| 日本在线播放一区二区三区| 亚洲风情在线资源站| 亚洲国产色一区| 一区二区免费视频| 亚洲午夜视频在线| 一区二区视频在线| 一区二区三区产品免费精品久久75| 18涩涩午夜精品.www| 亚洲欧美偷拍卡通变态| 亚洲视频资源在线| 一区二区三区欧美日| 亚洲成人精品一区| 午夜精品福利一区二区蜜股av | 日韩久久一区二区| 亚洲欧美欧美一区二区三区| 亚洲欧美偷拍卡通变态| 亚洲一区二区综合| 天涯成人国产亚洲精品一区av| 亚洲午夜久久久久久久久电影网 | 日韩精品电影在线观看| 青青青爽久久午夜综合久久午夜| 午夜精品123| 久久国产日韩欧美精品| 国产成人av福利| caoporn国产精品| 欧洲亚洲国产日韩| 日韩欧美国产不卡| 国产亚洲精品bt天堂精选| 亚洲私人影院在线观看| 天天亚洲美女在线视频| 久久99国产精品成人| 成人免费高清在线| 欧美在线不卡一区| 日韩欧美综合在线| 欧美国产一区在线| 亚洲图片一区二区| 黄页网站大全一区二区| www.亚洲精品| 91精品视频网| 国产精品婷婷午夜在线观看| 亚洲成人在线免费| 国产黄色精品视频| 欧美写真视频网站| 国产婷婷一区二区| 亚洲一区中文在线| 国产精品18久久久久| 在线观看成人免费视频| 精品成人私密视频| 亚洲国产精品久久人人爱| 国产精品自拍网站| 欧美三级一区二区| 日本一区二区视频在线| 日韩高清不卡在线| 色综合久久天天综合网| 日韩精品在线看片z| 亚洲视频一二三| 国产麻豆一精品一av一免费 | 国产一区二区三区蝌蚪| 在线精品国精品国产尤物884a| 久久综合视频网| 亚洲乱码国产乱码精品精的特点| 久久精品噜噜噜成人88aⅴ| 91在线看国产| 国产日韩精品一区二区三区在线| 亚洲国产精品一区二区久久恐怖片| 国产精品一区二区不卡| 欧美一区二区三区电影| 亚洲免费视频成人| 国产福利不卡视频| 欧美大白屁股肥臀xxxxxx| 一区二区三区四区不卡在线| 成人免费高清视频在线观看| 日韩一区二区三区电影在线观看 | 亚洲欧洲精品一区二区三区| 久久er精品视频| 日韩一区二区影院| 午夜精品在线视频一区| 欧美影院一区二区| 亚洲美女视频在线观看| av电影在线观看不卡| 中文字幕欧美日本乱码一线二线| 人人爽香蕉精品| 欧美日韩精品三区| 亚洲一区中文在线| 欧美午夜片在线看| 亚洲影院免费观看| 欧美午夜片在线看| 午夜国产不卡在线观看视频| 在线观看欧美日本| 一区二区三区**美女毛片| 日本高清免费不卡视频| 一区二区三区在线视频免费观看| 91视频你懂的| 亚洲午夜免费福利视频| 欧美日韩视频专区在线播放|