Dijstra鄰接表法

引用請註明出處:http://blog.csdn.net/int64ago/article/details/7084802

鄰接矩陣空間複雜度太大,對空間要求嚴格的可以參考我的,歡迎提出意見可憐

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 1<<30
const int MAXN=1000;
const int MAXM=1000;
typedef pair<int ,int >pii;//first是d[]值 second是對應的點


int n,m;//n個點m條邊
bool done[MAXN];
int u,v,w,next[MAXM],d[MAXN],dis[MAXN][MAXN];
int f[MAXN];//記錄路徑的
vector<int>adj[MAXN];//鄰接表
void read_graph()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			dis[i][j]=INF;//記錄點之間的距離
	for(int i=0;i<n;i++){f[i]=-1;adj[i].clear();}
	for(int e=0;e<m;e++)
	{
		scanf("%d%d%d",&u,&v,&w);
		dis[v][u]=dis[u][v]=w;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
}
priority_queue<pii,vector<pii>,greater<pii> >q;
void dijstra(int s)
{
	for(int i=0;i<n;i++)
		d[i]=(i==s?0:INF);
	memset(done,false,sizeof(done));//記錄是否已求出最短路
	q.push(make_pair(d[s],s));
	while(!q.empty())
	{
		pii u=q.top();
		q.pop();
		int x=u.second;
		if(done[x])continue;
		done[x]=true;
		int len=adj[x].size();
		for(int i=0;i<len;i++)//依次訪問x的臨邊(不在done內)
		{
			int e=adj[x][i];
			if(done[e]||dis[e][x]>=INF)continue;
			if(d[e]>d[x]+dis[e][x])
			{
				d[e]=d[x]+dis[e][x];
				//f[e]=x;//記錄路徑
				q.push(make_pair(d[e],e));
			}
		}
	}
}
int main()
{
	read_graph();
	dijstra(3);
	for(int i=0;i<n;i++)
	{
		cout<<d[i]<<endl;
		//打印路徑
		/*int e=i;
		while(f[e]!=-1)
		{
			cout<<e<<" ";
			e=f[e];
		}
		cout<<"\n\n";*/
	}
	return 0;
}


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