poj2387最短路径(此题的坑为有重边)

 /*dijkstra用于有权图,权值非负,起点终点已知,算法运行过程不断维护的关键信息是节点集合s。从源点(初始点)开始将路径最小的点u加入到集合s,不断重复该过程,终止条件是终点纳入集合s,他是贪心的策略但是正确的具体证明见算法导论第三版p385*/
/*题意为从1~n的最短路径*/
/*此题的坑主要是两点之间可能有重边在主函数中已解决详情见代码*/
 #include  
 #include  
 #include
 #include  
 using namespace std;
 const int INF=99999999;   
 int maps[1005][1005],v[1005],d[1005]; //v表示节点是(1)否(0)已纳入集合 | d表示当前这个集合最小值  
 int n;
 void Dijkstra(int s,int t)
 {
	 int i,j,k,mini;
	 for(i=1;i<=n;i++) d[i]=INF; 
	 d[s]=0;	//只有初始点的集合当然最小值为0 
	 for(i=1;i<=n;i++)	  //该层循环是为了说明从起始点查找到终点的最短路径最多查找n个节点即查找次数(不用在意) 
	 {                                                 
        mini=INF;
 		k=-1;	//纳入集合的将被标记,k为下标 
 		for(j=1;j<=n;j++)	//该层循环目的是 获得前驱节点的最小值并将前驱节点标记加入集合 
        {
			if(!v[j] && d[j]D) 	//这里一点要注意,两个点之间未必只有一条边这里目的  若有重边那么此时已经选择了最短的边 
				maps[x][y]=D,maps[y][x]=D;
        	}
			 Dijkstra(1,n);
     }	
 	return 0;
 }

你可能感兴趣的:(图论)