最短路徑【迪傑斯特拉算法】【模板】

附上詳解博客

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html


代碼是學長敲的,我在不懂的地方加了許多註釋,我感覺這一週的東西學的特別喫力,都是一知半解,懷疑智商中。





/*
	n個點,m條邊,求1 - n 的距離
	
	輸入x y z,表示x到y的距離爲z 
	
	不存在輸出-1 

*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
struct Pair
{
	int first;		//first存點
	int second;		//second存距離 
	bool friend operator < (Pair a,Pair b)		//結構體是不能直接進行比較的,小於號的含義就是 
	{						//如果a的second比b的second大,那麼a就比b小
		return a.second > b.second;		//放到優先隊列裏,就是a的優先級小
	}
}a1,a2;
int n,m;
vector<int> edge[105];		//存與之相連的邊 
int length[105][105];	   //存相連邊的長度 
int dis[105];		      //記錄到起點的距離 
 
void dijkstra()
{
	memset(dis,INF,sizeof(dis)); 		//把所有點到起點胡距離初始化爲最大值 
	bool vis[105];
	memset(vis,false,sizeof(vis));
	dis[1] = 0;
	a1.first = 1;	a1.second = 0;	
	priority_queue<Pair> Q;
	Q.push(a1);
	while ( !Q.empty() )
	{
		a1 = Q.top();
//		printf ("==%d %d==\n",pr.first,pr.second);
		Q.pop();
		if ( vis[a1.first] )
			continue;
		vis[a1.first] = true;
		
		for (int i = 0 ; i < edge[a1.first].size() ; i++)		// edge[a1.first].size()表示與當前點相連的點的個數 
		{
			//printf("edge[a1.first].size()= %d\n",edge[a1.first].size());
			a2.first = edge[a1.first][i];				
			a2.second = a1.second + length[a1.first][a2.first];
			
			if (a2.second < dis[a2.first])
			{
				dis[a2.first] = a2.second;
				Q.push(a2);
			}
		}
	}
}

int main()
{
	scanf ("%d%d",&n,&m);
	memset(length,-1,sizeof(length));
	for (int i = 1 ; i <= m ; i++)
	{
		int x,y,z;
		scanf ("%d%d%d",&x,&y,&z);
		edge[x].push_back(y);
		edge[y].push_back(x);		//雙向存圖 	
		if (length[x][y] == -1)
			length[x][y] = length[y][x] = z;				
		else
			length[x][y] = length[y][x] = min(z,length[x][y]);	//如果出現重邊,記錄較小的權值。 		
	}
	dijkstra();
	printf ("%d\n",dis[n] == INF ? -1 : dis[n]);
	return 0;
}


/*
7 10
1 3 3
1 4 1
3 4 1
2 3 5
3 5 5
4 5 2
3 6 2
5 6 1
5 7 7
6 7 4
*/












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章