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;
}


你可能感兴趣的:(Graph,ini,pair)