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

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

?? minimum spanning tree.cpp

?? 在圖形中若于個邊(edge)上加上一些值
?? CPP
字號:
/********************************************************************
	created:	2008/12/23
	created:	23:12:2008   9:03
	filename: 	General\Minimum Spanning Tree.cpp
	file path:	General
	file base:	Minimum Spanning Tree
	file ext:	cpp
	author:		G醔or Bern醫
	
	purpose:	This is a C/C++ implementation of the Prim and Kruskall 
				Algorithm Presenting the creation of the Minimal Spanning Tree
*********************************************************************/

/********************************************************************
	created:	23:12:2008   9:07	
	author:		G醔or Bern醫
	edited: 	-
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

// Create the edge type
struct Edge
{
	int from;
	int to; 
	int weight; 
	bool inTheCut; 
};
typedef Edge* pEdge; 


// adjacency list
struct ListIt
{
	int value;
	ListIt *p_next;
}; 

// typedef for the pointer type
typedef ListIt* pListIt;

pEdge edges;
pEdge edgesPr; 

int n,m; 

int *tree; 
int *ancient;
int **distanceMatrix; 


pListIt* adjacencyList; // Here we save the relations.... A 100000 is the maximum vertexes


void read(); 
void print(); 
void Kruskal(); 
int Prim(int at);
bool add(pListIt &dest, int val); 
int compareEdges(const void* el1, const void* el2);
int min_vag();

int main()
{
	read(); 
	printf("\n"); 
	print(); 
	
	//Kruskal();

	printf("\n\n With Prims Technique: \n\n"); 
	Prim(1);

	return 0;
}

//************************************
// Method:    read - public  access
// Returns:   void
//
// Purpose:   Read in the data from In.txt
//************************************
void read()
{
	FILE *f; 
	freopen_s(&f, "In.txt", "r", stdin); 
	freopen_s(&f, "Out.txt", "w", stdout); 

	scanf_s("%d", &n); 
	scanf_s("%d", &m); 	

	tree = (int*) calloc(n+1, sizeof(int)); 
	ancient = (int*) calloc(n+1, sizeof(int)); 
	edges = (pEdge)malloc(m*sizeof(Edge)); 
	adjacencyList = (pListIt*) calloc(n+1,sizeof(pListIt));

	distanceMatrix = (int**) calloc(n+1, sizeof(int*)); 
	for (int j = 1; j <=n; ++j)
	{
		distanceMatrix[j] = (int*) calloc(n+1, sizeof(int)); 
	}


	int from,to,distance; 

	for(int i =0; i< m; ++i)
	{
		scanf_s("%d%d%d", &from, &to, & distance);

		add(adjacencyList[from], to);
		add(adjacencyList[to], from);

		edges[i].from = from;
		edges[i].to = to;
		edges[i].weight = distance;
	}
}

//************************************
// Method:    print - public  access
// Parameter: 
// Returns:   void
//
// Purpose:   Print the list of edges
//************************************
void print()
{
	printf("\n The list of the edges:\n "); 
	for(int i =0; i < m; ++i)
	{	
		if(!(i % 1)) // how many in a row... for now 1 edge per row
		{
			printf("\n");
		}
		printf(" %d ~ %d -> %d   ", edges[i].from, edges[i].to, edges[i].weight);
	}

	printf("\n");

}

void Kruskal()
{
	int i = 0, overallWeight = 0 , j =0; 
	int fromTree = 0, toTree = 0, changeNr = 0; 


	// sort the edge list
	qsort((void*)edges,m,sizeof(Edge),compareEdges);


	printf("\n"); 
	print(); 
	printf("\n"); 

	printf("\nThe list of the edges with the algorithm of Kruskall:\n"); 


	// build up the individual list
	for ( i =1;  i <= n; ++i)
		tree[i] = i;


	for ( i= 0; i < m && changeNr < n; ++i)
	{
		fromTree = tree[edges[i].from];
		toTree = tree[edges[i].to];

		if( fromTree != toTree)
		{
			++changeNr; 
			overallWeight += edges[i].weight; 
			printf("   %d) %d ~ %d -> %d  \n", changeNr, edges[i].from, edges[i].to, edges[i].weight);
			
			//Union of the trees
			for ( j = 0; j < m; ++j)
				if(tree[j] == toTree)
					tree[j] = fromTree;
		}	
	}
	printf( " \n The minimal weight %d ", overallWeight);  

}

//************************************
// Method:    compareEdges - public  access
// Parameter: 
//			  const void * edge1
//			  const void * edge2
// Returns:   int
//
// Purpose:   Compare two edge types according to their weight
//************************************
int compareEdges(const void* edge1, const void * edge2)
{
	pEdge first = (pEdge)edge1;
	pEdge second = (pEdge)edge2;

	return first->weight - second->weight; 
}

//************************************
// Method:    Prim - public  access
// Parameter: 
//			  int at
// Returns:   int
//
// Purpose:   Prims Technique to generate the minimal spanning tree
//************************************
int Prim(int at)
{
	int i = 0; 
	
	memset(tree, 0, (n+1)*sizeof(int)); 

	tree[at] = 1; 
	ancient[at]  = 0 ;
	

	// sort the edge list
	qsort((void*)edges,m,sizeof(Edge),compareEdges);


	// build up the tree
	for (i = 0; i < m; ++i)
	{
		distanceMatrix[edges[i].from][edges[i].to  ] = i;
		distanceMatrix[edges[i].to  ][edges[i].from] = i;

		if (edges[i].from == at || edges[i].to == at)
		{
			edges[i].inTheCut = true;
		}
		else
		{
			edges[i].inTheCut = false;
		}
	}

	int overallWeight = 0; 
	int curent = 0; 
	int addedVertex = 1; 
	int neighborVertex = 0;
	int neighborEdge = 0; 
	pListIt p = NULL; 
	int j = 0; 

	for(i = 1; i < n; ++i)
	{
		for ( j =0 ; j < m; ++j)
		{
			if (edges[j].inTheCut)
			{
				curent = j; 
				break;
			}
		}


		printf( "   %d)  %d ~ %d -> %d \n",i, edges[curent].from,edges[curent].to, edges[curent].weight);

		overallWeight += edges[curent].weight;

		if (tree[edges[curent].from] == 1)
		{
			addedVertex = edges[curent].to;
			ancient[addedVertex] = edges[curent].from; 
		}

		tree[addedVertex] = 1; 

		for (p = adjacencyList[addedVertex]; p != NULL; p = p -> p_next)
		{
			neighborVertex = p->value;
			neighborEdge = distanceMatrix[addedVertex][neighborVertex];

			if (tree[neighborVertex] == 1)
				edges[neighborEdge].inTheCut = false; // reset if both ends are there
			else
				edges[neighborEdge].inTheCut = true; // set if only one is there

		}

	}

	printf( "\n\n The overall Weight: %d " , overallWeight);
	return 0;
}


// Here we need to make sure that the items are added in 	 // correct order
bool add(pListIt &dest, int val)
{
	//create the item
	pListIt p;
	p = (pListIt) malloc(sizeof(ListIt));
	p -> value = val;	

	if(!dest)  // first item addition 
	{
		p -> p_next = NULL;
		dest = p;	
	}
	else
	{	
		pListIt find = dest; 
		pListIt at = NULL; 

		// first find the first greater number, insert before
		while(find && find->value <= val)
		{
			if( find->value == val) // do not add a duplicate
			{
				free(p);
				return false;
			}

			at = find; 
			find = find->p_next;					
		}

		// insert at 
		if (at) // insert at a valid point
		{
			p->p_next = at->p_next;
			at->p_next = p; 				
		}
		else // insert at the start
		{
			p->p_next = dest; 
			dest = p; 
		}
	}

	return true; 
}

/*
Sample Input: => In.txt

9 13
1 2 10
1 9 60
1 3 30
2 9 50
2 3 20
3 9 40
3 4 70
4 5 110
3 5 120
3 6 100
5 6 130
6 8 90
6 7 80



Sample Output: => Out.txt

The list of the edges:

1 ~ 2 -> 10   
1 ~ 9 -> 60   
1 ~ 3 -> 30   
2 ~ 9 -> 50   
2 ~ 3 -> 20   
3 ~ 9 -> 40   
3 ~ 4 -> 70   
4 ~ 5 -> 110   
3 ~ 5 -> 120   
3 ~ 6 -> 100   
5 ~ 6 -> 130   
6 ~ 8 -> 90   
6 ~ 7 -> 80   


The list of the edges:

1 ~ 2 -> 10   
2 ~ 3 -> 20   
1 ~ 3 -> 30   
3 ~ 9 -> 40   
2 ~ 9 -> 50   
1 ~ 9 -> 60   
3 ~ 4 -> 70   
6 ~ 7 -> 80   
6 ~ 8 -> 90   
3 ~ 6 -> 100   
4 ~ 5 -> 110   
3 ~ 5 -> 120   
5 ~ 6 -> 130   


The list of the edges with the algorithm of Kruskall:
1) 1 ~ 2 -> 10  
2) 2 ~ 3 -> 20  
3) 3 ~ 9 -> 40  
4) 3 ~ 4 -> 70  
5) 6 ~ 7 -> 80  
6) 6 ~ 8 -> 90  
7) 3 ~ 6 -> 100  
8) 4 ~ 5 -> 110  

The minimal weight 520 

With Prims Technique: 

1)  1 ~ 2 -> 10 
2)  2 ~ 3 -> 20 
3)  3 ~ 9 -> 40 
4)  3 ~ 4 -> 70 
5)  3 ~ 6 -> 100 
6)  6 ~ 7 -> 80 
7)  6 ~ 8 -> 90 
8)  4 ~ 5 -> 110 


The overall Weight: 520 

*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
3d成人h动漫网站入口| 综合久久久久久| 国产精品免费免费| 午夜精品福利一区二区三区蜜桃| 国产大陆a不卡| 欧美日韩一区二区三区在线看| 久久先锋影音av鲁色资源网| 亚洲一区二区三区四区的| 国产久卡久卡久卡久卡视频精品| 欧美日韩一区精品| 一区二区三区毛片| 成人午夜电影久久影院| xvideos.蜜桃一区二区| 亚洲高清免费视频| 91激情在线视频| 国产精品区一区二区三| 国产sm精品调教视频网站| 日韩三级.com| 青草av.久久免费一区| 在线中文字幕不卡| 亚洲人成影院在线观看| 成人一道本在线| 久久久久久久久久看片| 看国产成人h片视频| 欧美日本在线一区| 午夜视频一区二区| 在线观看日韩电影| 亚洲自拍欧美精品| 欧美日韩免费观看一区二区三区 | 国产不卡高清在线观看视频| 日韩欧美国产wwwww| 亚洲va欧美va国产va天堂影院| 欧美在线一区二区三区| 一区二区视频在线| 欧美性大战久久| 亚洲国产成人av好男人在线观看| 日本高清视频一区二区| 亚洲综合色在线| 欧美日韩中文精品| 日韩av高清在线观看| 日韩欧美色电影| 激情文学综合网| 国产视频在线观看一区二区三区| 国产精品一区二区果冻传媒| 国产色产综合色产在线视频| 豆国产96在线|亚洲| 中文文精品字幕一区二区| av中文字幕亚洲| 亚洲国产欧美在线人成| 欧美一区三区四区| 国产精品自在在线| 综合激情成人伊人| 欧美日韩激情一区二区三区| 麻豆精品在线播放| 国产日韩欧美亚洲| 色中色一区二区| 天堂成人国产精品一区| 亚洲精品在线三区| 99久久综合色| 五月天中文字幕一区二区| 日韩一卡二卡三卡| 成人免费av在线| 午夜欧美2019年伦理 | 欧美日韩在线精品一区二区三区激情| 亚洲第一在线综合网站| 2欧美一区二区三区在线观看视频| 国产精品888| 亚洲与欧洲av电影| 久久久激情视频| 欧美性受xxxx黑人xyx性爽| 激情综合色播激情啊| 亚洲三级免费电影| 欧美v日韩v国产v| 91农村精品一区二区在线| 日韩在线一区二区三区| 国产精品毛片大码女人| 欧美一区二区福利在线| a在线欧美一区| 久久99精品久久只有精品| 亚洲区小说区图片区qvod| 欧美精品一区二区三区四区| 日本乱人伦aⅴ精品| 国产麻豆午夜三级精品| 亚洲成a人v欧美综合天堂 | 日韩欧美一二区| 91免费版pro下载短视频| 久久精品国产网站| 亚洲午夜日本在线观看| 国产精品嫩草久久久久| 日韩一级高清毛片| 精品污污网站免费看| eeuss鲁片一区二区三区| 精品一区二区三区在线观看 | 99久久精品国产网站| 久久99久久99精品免视看婷婷| 亚洲黄网站在线观看| 国产精品视频看| 国产免费成人在线视频| 精品国产乱码久久久久久1区2区 | 久久精品国产99国产精品| 亚洲自拍都市欧美小说| 亚洲欧美成人一区二区三区| 中文字幕不卡在线| 久久久亚洲国产美女国产盗摄| 欧美成人一区二区三区| 91麻豆精品国产91久久久久久久久| 色综合久久综合网97色综合| 成人av资源站| 国产·精品毛片| 成人黄色一级视频| 丰满少妇久久久久久久| 懂色av一区二区夜夜嗨| 成人午夜在线免费| 国产91精品露脸国语对白| 国产剧情一区二区| 成人网在线播放| 北条麻妃国产九九精品视频| 成人免费高清在线| 成人h动漫精品一区二| 成人福利视频网站| 91麻豆高清视频| 色素色在线综合| 欧美亚洲国产怡红院影院| 欧美日韩另类一区| 日韩一区二区影院| 久久久久久97三级| 国产精品久久精品日日| 亚洲另类中文字| 午夜精品久久一牛影视| 日韩av午夜在线观看| 国内外成人在线视频| 成人国产亚洲欧美成人综合网| av电影在线观看一区| 91久久免费观看| 在线播放日韩导航| 欧美精品一区男女天堂| 中文字幕免费观看一区| 亚洲啪啪综合av一区二区三区| 亚洲午夜精品17c| 美女被吸乳得到大胸91| 国产成人aaaa| 欧美性色黄大片| 欧美xxxx老人做受| 亚洲日本成人在线观看| 丝袜美腿亚洲综合| 粉嫩嫩av羞羞动漫久久久| 日本韩国欧美国产| 精品国精品国产| 亚洲人成人一区二区在线观看| 亚洲大尺度视频在线观看| 韩国三级在线一区| 一本到高清视频免费精品| 欧美一级精品大片| 成人免费在线视频观看| 美女视频网站黄色亚洲| 99国产精品国产精品久久| 91精品国产综合久久精品麻豆| 久久精品人人做人人综合| 亚洲影院久久精品| 国产精品77777| 69p69国产精品| 亚洲图片你懂的| 国产一区二区精品在线观看| 91激情在线视频| 中文字幕国产一区二区| 蜜臀av一级做a爰片久久| 91在线国内视频| 精品国产免费一区二区三区四区 | 亚洲国产视频直播| 国产.欧美.日韩| 日韩一二在线观看| 一区二区三区毛片| 成人av片在线观看| 久久久三级国产网站| 视频一区国产视频| 色综合久久88色综合天天 | 日韩免费高清视频| 亚洲一区成人在线| 99视频热这里只有精品免费| 久久日韩精品一区二区五区| 亚洲h精品动漫在线观看| 97久久精品人人做人人爽| 日本一区二区视频在线观看| 蜜桃久久av一区| 欧美一区二区三区不卡| 亚洲一区二区四区蜜桃| 91免费观看在线| 日韩毛片视频在线看| 本田岬高潮一区二区三区| 久久久精品免费观看| 国产麻豆精品theporn| 精品日韩一区二区| 免费观看成人av| 91精品国产综合久久香蕉麻豆| 一二三区精品视频| 欧美三级日韩在线| 首页国产欧美日韩丝袜| 欧美老女人第四色| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩一区二区三区四区|