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

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

?? graph.cpp

?? I implement Dijkstra s Single Source Shortest Path, say SSP, algorithm for directed graphs using a s
?? CPP
字號:
// Graph.cpp: implementation of the Graph class. Define the graph using adjacency list
// also define the Dijkstra algorithm for this graph.
//
//////////////////////////////////////////////////////////////////////

#include "Graph.h"

/*
 *construct the graph with user input, user input in the form of "From To Cost"
 */
Graph::~Graph()
{
	clear();
}

Graph::Graph()
{
	cout<<"construct the graph with user input, please input the edges:"
		<<endl
		<<"From To Cost:"
		<<endl;
	istream & is = cin;
	buildGraph(is);
}

/*
 *construct a graph randomly
 *int node_num; number of nodes in the graph
 *density: the edge density in the graph, 10 means 10%
 */
Graph::Graph(int node_num, int density)
{
	/*output to file*/
	//fstream fs;
	//fs.open("output.dat",fstream::out);
	
	/* initialize random generator */
	srand ( time(NULL) );	

	int max_edge = node_num*(node_num-1)*density/100;
	int from, to, cost;
	Edge * e;

	while(true){
		initialize();
		e = new Edge();
		e->node = 0; 
		e->cost = rand()%1000+1; e->next = 0;
		//fs<<0<<" "<<1<<" "<<e->cost<<endl;
		addNewEdge(node_num-1, e);
		for(int i=0; i<node_num-1; i++){
			//from = rand()%i;
			e = new Edge();
			e->node = i+1;
			e->cost = rand()%1000+1; e->next = 0;
			//fs<<i<<" "<<i+1<<" "<<e->cost<<endl;
			addNewEdge(i, e);
		}
		while(edge_num<max_edge){
			from = rand()%node_num;
			//if(from==node_num) from--;
			//do{
			to = rand()%node_num+1;
			if(to==node_num) to--;
			//}
			//while(from==to);
			cost = rand()%1000+1;
			e = new Edge();
			e->node = to; e->cost = cost; e->next = 0;
			if(addNewEdge(from, e)){
				//fs<<from<<" "<<e->node<<" "<<e->cost<<endl;
			}
		}
		if(isConnected()){
			//fs<<"*"<<endl;
			//fs.close();
			return;
		}
		clear();	
	}
}

/*construct a graph from a file*/
Graph::Graph(const char * fileName)
{
	cout<<"construct the graph from an input file:"<<fileName
		<<endl;
	fstream fs;
	fs.open(fileName, fstream::in);
	istream & is = fs;
	buildGraph(is);	
	fs.close();
}

/*
 *if the adj_list is not long enough, extend the list in the step of 20.
 *int newlength: the expected length of the new adj_list
 */
void Graph::extendAdjList(int newlength){
	Node* tmp = new Node [newlength];
	for(int i1=0; i1<newlength; i1++) {
		tmp[i1].degree = -1;
	}
	for(int i=0; i<adj_length; i++){
		tmp[i].degree = adj_list[i].degree;
		tmp[i].e = adj_list[i].e;
	}
	delete [] adj_list;
	adj_list = tmp;
	adj_length = newlength;
}

/*
 *add a new edge into the adj_list of the graph
 *int from: the start node of the edge
 *Edge * e1: the end node and the cost of the edge
 */
bool Graph::addNewEdge(int from, Edge * e1)
{
	int m = from>e1->node?from:e1->node;
	if(m>=adj_length){ //there is no enough length of adjlist
		extendAdjList((m/20+1)*20);
	}
	//if node from never apperars before, add a new node and edge.
	if(adj_list[from].degree<0){
		adj_list[from].degree = 0;
		node_num++;
	}
	if(adj_list[from].degree==0){
		adj_list[from].e = e1;
	}
	else {//if node from already existed, add a new edge
		Edge *tmp = adj_list[from].e;
		Edge * last = tmp;
		for(int i=0; i<adj_list[from].degree; i++){
			if(tmp->node==e1->node){
				return false;
			}
			last = tmp;
			tmp=tmp->next;
		}
		last->next = e1;
	}

	//if node to never apperars before, add a new node.
	if(adj_list[e1->node].degree<0){
		adj_list[e1->node].degree = 0;
		node_num++;
	}
	(adj_list[from].degree)++;
	edge_num++;
	return true;
}

/*
 *Initialize the graph
 */
void Graph::initialize()
{
	adj_length = 20;
	node_num = 0;
	edge_num = 0;
	adj_list = new Node[20];
	for(int i=0; i<20; i++){
		adj_list[i].degree = -1;
	}
}

/*
 *For user input mod, take both std::in or a file as a input to construct the graph
 *std::istream & is: input stream, can be either a file or a key board input
 */
void Graph::buildGraph(std::istream & is)
{
	int index=0, from, to, cost;
	Edge * e;
	initialize();
	while(is>>from>>to>>cost){
		e = new Edge();
		e->node = to; e->cost = cost; e->next = 0;
		addNewEdge(from, e);
	}	
}

/*
 *Clear the adj_list of the graph
 */
void Graph::clear()
{
	for(int i=0; i<adj_length; i++){
		Edge * tmp = adj_list[i].e;
		for(int j = 0; j<adj_list[i].degree; j++){
			Edge * tmp1 = tmp;
			tmp = tmp->next;
			delete tmp1;
		}
	}

	delete [] adj_list;
}

/*
 *For random mode, test if the graph is connected using DFS from node 0;
 *If connected, return true, else return false.
 */
bool Graph::isConnected()
{
	int i;
	bool * isVisited = new bool [node_num];
	  
	for(i=0; i<node_num; i++) isVisited[i] = false;

	DFS(0, isVisited);
	  
	for(i=0; i<node_num; i++) {
		if(isVisited[i] == false)
		  return false; 
		}
	return true;
}

/*
 *Depth first search from a start node,find its connected component.
 *int startNode: the node where DFS started
 *bool* isVisited: a boolean array that give a flag of true for each node visited in DFS
 */
void Graph::DFS(int startNode, bool* isVisited)
{
	isVisited[startNode] = true;

	Edge * e = adj_list[startNode].e;
	for(int i=0; i<adj_list[startNode].degree; i++, e=e->next) {
		int node = e->node;
		if(!isVisited[node])
			DFS(node, isVisited);
	} 
}



void Graph::testInput(void)
{
	cout<<"Node num: "<<node_num<<endl;
	cout<<"Edge num: "<<edge_num<<endl;
	for(int i=0; i<adj_length; i++){
		Node n = adj_list[i];
		if(n.degree>=0){
			cout<<"Node "<<i<<endl;
			cout<<"degree:"<<n.degree<<endl;		
			Edge * e1 = n.e;
			for(int j=0; j<n.degree; j++){
				cout<<i<<" to "<<e1->node;
				cout<<" cost: "<<e1->cost<<endl;
				e1 = e1->next;
			}
		}
	}
}

/*
 *Dijkstra's single source shortest path algorithm. compute the shortest path from node 0 to 
 *all the other nodes in the graph.
 *DistSet * dist_set: can be either array, Fibonacci Heap or Pairing Heap
 *Result: store the result of Dijkstra
 */
Result Graph::DijkstraSSP(int source, DistSet * dist_set)
{ 
	bool * found = new bool[node_num];
	Result * r = new Result(node_num);
	int v, i;
	Edge * e;
	for(int i1=0; i1<node_num; i1++){
		found[i1] = false;
		(r->dist)[i1] = INT_MAX;
	}
	(r->dist)[source] = 0;
	dist_set->insert(source, 0);
	found[source] = true;
	
	while(!dist_set->IsEmpty()){
		v = dist_set->deleteMin();
		if((r->dist)[v] == INT_MAX){
			return *r;
		}
		e = adj_list[v].e;
		for(i=0; i<adj_list[v].degree; i++, e=e->next){
			int newDist = r->dist[v] + e->cost;
			if(r->dist[e->node]>newDist){
				r->dist[e->node] = newDist;
				if(found[e->node]) {
					dist_set->decreasDist(e->node, r->dist[e->node]);
				}
				else {
					dist_set->insert(e->node, r->dist[e->node]);
					found[e->node] = true;
				}
			}
		}
	}
		return *r;
}

int main(int argc,char *argv[])
{
	
	//PHeap::testPHeap();
/*	Graph * g = new Graph("input.dat");
	cout<<"Node";
	for(int i=0; i<4; i++){
		cout<<"\t"<<i;
	}
	cout<<endl;
	for(int i=0; i<4; i++){
		DistSet * ph = new PHeap(g->getNodeNum());
		Result r3 = g->DijkstraSSP(i, ph);
		cout<<i;
		r3.printResult();
	}*/
	
	clock_t start;
	double s_time, f_time, p_time;
	DistSet * ds;
	Graph * g;

	if(argc==1){
		cout<<"too few parameters!";
		return 1;
	}

	char * pchar = argv[1];

	fstream fs;
	fs.open("output.dat",fstream::out);
	
	switch(pchar[1])
	{
		case 'r':
		{
			fs<<"|V|\t"<<"Density\t"<<"Simple\t"<<"FHeap\t"<<"PHeap\t"<<endl;
			cout<<"|V|\t"<<"Density\t"<<"Simple\t"<<"FHeap\t"<<"PHeap\t"<<endl;
			for(int i=1; i<=1; i++){//|V| from 100 to 500
				for(int j=1; j<=10; j++){//density from 10% to 100%
					s_time = 0; f_time = 0; p_time = 0;
					for(int l=0; l<5; l++){//run 5 times
						g = new Graph(i*100, j*10);
						start = clock();
						for(int k1=0; k1<i*100; k1++){
							DistSet * ph = new PHeap(g->getNodeNum());
							Result r3 = g->DijkstraSSP(k1, ph);
							delete ph;
						}
						p_time += (double)(clock()-start);
					
						start = clock();
						for(int k2=0; k2<i*100; k2++){
							DistSet * fh = new FHeap(g->getNodeNum());
							Result r2 = g->DijkstraSSP(k2, fh);
							delete fh;
						}
						f_time += (double)(clock()-start);
						
						start = clock();
						for(int k=0; k<i*100; k++){
							DistSet * as = new ArraySet(g->getNodeNum());
							Result r1 = g->DijkstraSSP(k, as);
							delete as;
						}
						s_time += (double)(clock()-start);
						delete g;
					}
					fs<<i*100<<"\t"<<j*10<<"%\t"<<s_time/5<<"\t"<<f_time/5<<"\t"<<p_time/5<<endl;
					cout<<i*100<<"\t"<<j*10<<"%\t"<<s_time/5<<"\t"<<f_time/5<<"\t"<<p_time/5<<endl;
				}
			}	
			fs.close();
			break;
		}
		case 'i': //user input model
		{
			if(argc==3){//from file
				g = new Graph(argv[2]);
			}
			else{//from screen input
				g = new Graph();
			}
			if(g->adj_list[0].degree<=0){
				cout<<"Invalid Graph!"<<endl;
				return 0;
			}
			switch(pchar[2])
			{
				case 's': //simple scheme
					ds = new ArraySet(g->getNodeNum());
					break;
				case 'f': //fibonacci heap scheme
					ds = new FHeap(g->getNodeNum());
					break;
				case 'p': //pairing heap scheme
					ds = new PHeap(g->getNodeNum());
					break;
			}
			cout<<"Node";
			for(int i1=0; i1<g->getNodeNum(); i1++){
				cout<<"\t"<<i1;
			}
			cout<<endl;
			for(int i=0; i<g->getNodeNum(); i++){
				Result r = g->DijkstraSSP(i, ds);
				cout<<i;
				r.printResult();
				ds->initial();
			}
			delete g;
			delete ds;
		}
	}
	char blah;
	cout << "Press q to exit"<<endl;
	cin >> blah;
	return 1;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品久久只有精品| 日韩电影在线免费看| 中文字幕永久在线不卡| 亚洲成在人线在线播放| 国产一区视频在线看| 亚洲一二三区不卡| 粉嫩一区二区三区性色av| 污片在线观看一区二区| 欧美日韩不卡一区| 欧美理论在线播放| 国产精品毛片高清在线完整版| 日韩av网站免费在线| 91亚洲精品一区二区乱码| 久久精品一区二区| 免费不卡在线视频| 在线不卡中文字幕| 亚洲综合丝袜美腿| 色婷婷亚洲一区二区三区| 国产精品美女久久久久久久久| 另类综合日韩欧美亚洲| 91精品国模一区二区三区| 亚洲亚洲人成综合网络| 91成人在线精品| 亚洲天堂免费在线观看视频| 看片网站欧美日韩| 精品一区二区综合| 国产精品一品视频| 久久99热这里只有精品| 国产精品中文字幕日韩精品| 日韩精品一区二区三区视频播放 | 中文字幕亚洲不卡| 国产麻豆视频一区| 国产午夜精品福利| 国产乱妇无码大片在线观看| 久久亚洲欧美国产精品乐播| 国产精品123| 国产日产精品1区| 丁香婷婷综合五月| 欧美激情一区二区| 99久久精品99国产精品| 亚洲一区二区三区中文字幕在线| 日本久久一区二区三区| 欧美系列亚洲系列| av男人天堂一区| 日韩高清电影一区| 久久久久成人黄色影片| 一区二区三区在线看| 91官网在线免费观看| 亚洲成年人影院| 欧美一级理论片| 国产乱码精品一区二区三区五月婷| 久久久久久夜精品精品免费| 精品一区二区三区免费播放 | 亚洲一区二区av在线| 欧美午夜影院一区| 免费亚洲电影在线| 欧美激情一区二区| 欧美日韩视频在线第一区| 美国三级日本三级久久99| 久久―日本道色综合久久| 99精品视频在线免费观看| 亚洲h动漫在线| 亚洲图片欧美激情| 一区二区三区在线视频免费| 国产精品一级黄| 亚洲久本草在线中文字幕| 欧美日本在线观看| 国产精品亚洲а∨天堂免在线| 亚洲视频免费观看| 日韩精品一区在线观看| av电影天堂一区二区在线| 日韩精品成人一区二区三区| 中文字幕欧美三区| 欧美日韩视频第一区| 成人永久aaa| 婷婷国产在线综合| 日韩理论电影院| 欧美大片一区二区| 色成年激情久久综合| 国产米奇在线777精品观看| 亚洲高清久久久| 中文字幕亚洲综合久久菠萝蜜| 欧美一级夜夜爽| 91看片淫黄大片一级在线观看| 激情成人午夜视频| 男女性色大片免费观看一区二区| 中文字幕乱码久久午夜不卡 | 久久精品国产秦先生| 亚洲人成精品久久久久| 久久网站最新地址| 欧美情侣在线播放| 91浏览器打开| 99re热这里只有精品视频| 国产综合色精品一区二区三区| 天堂va蜜桃一区二区三区漫画版| 中国av一区二区三区| 久久久国际精品| 久久日韩粉嫩一区二区三区| 欧美一级日韩一级| 欧美精品色一区二区三区| 色婷婷亚洲一区二区三区| fc2成人免费人成在线观看播放 | 日韩黄色片在线观看| 午夜一区二区三区视频| 亚洲综合免费观看高清完整版| 国产精品乱子久久久久| 国产无一区二区| 国产午夜精品一区二区 | 欧美精品成人一区二区三区四区| 色综合久久久久| 91老师国产黑色丝袜在线| 99久久久精品| 99精品在线免费| 色婷婷综合五月| 欧美一a一片一级一片| 日本高清视频一区二区| 欧洲人成人精品| 欧美一区二区美女| 欧美一区午夜视频在线观看| 欧美一区二区三级| 精品国产一二三| 国产三级精品视频| 亚洲免费视频成人| 亚洲电影在线播放| 另类小说欧美激情| 国产精品一区三区| 成人在线视频首页| 欧美影院午夜播放| 欧美一区二区在线播放| 精品少妇一区二区三区在线视频 | 91精品国产麻豆国产自产在线| 91麻豆精品国产自产在线| 欧美成人性福生活免费看| 国产日韩欧美不卡在线| 亚洲女人小视频在线观看| 天堂资源在线中文精品| 国产乱码精品一区二区三区忘忧草| www.色综合.com| 51久久夜色精品国产麻豆| 欧美国产97人人爽人人喊| 亚洲自拍偷拍九九九| 激情文学综合网| 97se亚洲国产综合自在线观| 欧美一区二区在线视频| 中文字幕av在线一区二区三区| 亚洲综合一区二区| 国产精品一区二区黑丝| 色综合久久天天综合网| 精品国产乱码久久久久久免费 | 色综合色综合色综合| 欧美精品一级二级| 日本一区二区视频在线观看| 亚洲欧美日韩电影| 九一九一国产精品| 色哟哟在线观看一区二区三区| 5月丁香婷婷综合| 亚洲欧美另类久久久精品2019| 麻豆久久久久久| 91视频观看免费| 久久综合久久综合久久| 亚洲一区二区偷拍精品| 国产电影一区在线| 欧美二区三区的天堂| 中文字幕不卡在线观看| 美女久久久精品| 欧美最新大片在线看 | k8久久久一区二区三区| 日韩一级完整毛片| 一区二区三区欧美在线观看| 国产一区二区91| 日韩欧美视频一区| 一区二区三区在线免费视频| 成人精品国产一区二区4080| 日韩精品中文字幕在线不卡尤物| 一区二区三区不卡视频在线观看| 国产盗摄视频一区二区三区| 日韩一区二区在线观看视频播放| 亚洲乱码精品一二三四区日韩在线| 黑人巨大精品欧美黑白配亚洲| 777精品伊人久久久久大香线蕉| 亚洲日本护士毛茸茸| 高清不卡一区二区在线| 亚洲精品一区二区三区影院| 青青草原综合久久大伊人精品| 在线观看亚洲专区| 亚洲人成亚洲人成在线观看图片| 从欧美一区二区三区| 国产欧美日韩三级| 国产一区二区电影| 国产婷婷一区二区| 国产一区二区中文字幕| wwwwxxxxx欧美| 国产一区二区不卡在线| 欧美成人一区二区三区片免费| 久久国产精品99久久久久久老狼| 欧美主播一区二区三区美女| 樱桃视频在线观看一区| 91成人在线精品| 亚洲成人777| 日韩一二三四区|