⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdijkstrawithgp.cpp

📁 未优化的DIjkstra算法,可以用于速度比较啊!建议下载
💻 CPP
字号:
// TestDijkstraWithGP.cpp : Defines the entry point for the console application.
//
// TestDijkstra.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <limits.h>
#include <stdlib.h>
#include <windows.h>
#include <memory.h>
#define ET double //目前暂时使用INT版本

typedef struct _DATANODE
{
	ET power;
	int Number;
}DATANODE;
typedef struct _GPNODE
{
	int NeibourCount;
	int Number;
	DATANODE *data;
}GPNODE;
ET Dijkstra(GPNODE *inputrect,int n,ET bignum,int s,int d,int *&path);

int main(int argc, char* argv[])
{
	if(argc<3)
		return 1;
	FILE *fp=fopen("AdjMatrixLarge.txt","r");
	int	nodenum=23540;
	GPNODE *node=new GPNODE[nodenum];
	DATANODE *temp=new DATANODE[nodenum];
	int nodecount=0;
	int node1,node2;
	ET power;
	ET bignum=1;
	node1=0;
	while(!feof(fp))
	{
		int tempnode1;
		fscanf(fp,"%d",&tempnode1);
		fscanf(fp,"%d",&node2);
		fscanf(fp,"%lf\n",&power);
		bignum+=power;
		if(tempnode1==node1)
		{
			temp[nodecount].power=power;
			temp[nodecount].Number=node2;
			nodecount++;
		}
		else
		{
			node[node1].NeibourCount=nodecount;
			node[node1].Number=node1;
			node[node1].data=new DATANODE[nodecount];
			memcpy(node[node1].data,temp,sizeof(DATANODE)*nodecount);
			nodecount=1;
			node1=tempnode1;
			temp[0].power=power;
			temp[0].Number=node2;
		}
	}
	fclose(fp);
	
	int s=atoi(argv[1])-1;
	int t=atoi(argv[2])-1;
	
	int *path;
	DWORD nsTime=GetTickCount();
	ET rlt=Dijkstra(node,nodenum,bignum,s,t,path);
	DWORD nTime=GetTickCount()-nsTime;
	printf("\n%lf\n",rlt);
	int *queue=new int[nodenum];
	int count=1;
	queue[0]=t+1;
	while(s!=t)
	{
		queue[count]=path[t]+1;
		t=path[t];
		count++;
	}
	printf("path is: ");
	for(int i=0;i<count-1;i++)
	{
		printf("%d->",queue[count-1-i]);
	}
	printf("%d\n",queue[0]);
	printf("path Count:%d\nElplased Time:%d\n",count,nTime);
	delete[]queue;
	return 0;
}
ET Dijkstra(GPNODE *inputrect,int n,ET bignum,int s,int t,int *&path)
{
	ET *d=new ET[n];
	int *mark=new int[n];
	path=new int[n];
	memset(mark,0,n*sizeof(int));
	for(int i=0;i<n;i++)
		path[i]=s;
	for(i=0;i<n;i++)
		d[i]=bignum;
	for(i=0;i<inputrect[s].NeibourCount;i++)
	{
		int number=inputrect[s].data[i].Number;
		ET power=inputrect[s].data[i].power;
		d[number]=power;
	}
	mark[s]=1;path[s]=0;d[s]=0;
	for(i=0;i<n;i++)
	{
		ET minc=bignum;
		int w=-1;
		for(int j=0;j<n;j++)
		{
			if(mark[j]==0&&minc>=d[j])
			{
				minc=d[j];
				w=j;
				
			}
		}
		if(w!=-1)
		{
			mark[w]=1;
			/*
			memset(temprecord,0,sizeof(int)*n);
						for(j=0;j<inputrect[w].NeibourCount;j++)
						{
							temprecord[inputrect[w].data[j].Number]=1;
							tempvalue[inputrect[w].data[j].Number]=inputrect[w].data[j].power;
						}
						for(j=0;j<n;j++)
						{
							if(mark[j]==0)
							{
			
								if(temprecord[j]==1)
								{
									if(d[j]>d[w]+tempvalue[j])
									{
										d[j]=d[w]+tempvalue[j];
										path[j]=w;
									}
									
								}
							}
						}*/
			for(j=0;j<inputrect[w].NeibourCount;j++)
			{
				int number=inputrect[w].data[j].Number;
				ET temp=d[w]+inputrect[w].data[j].power;
				if(mark[number]==0&&d[number]>temp)
				{
						d[number]=temp;
						path[number]=w;
				}
			}
			if(w==t)
				break;
		}
		else
			break;
	}
	ET rlt=d[t];
	delete[] d;
	delete[] mark;
	return rlt;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -