Dijstra邻接表法

来源:互联网 发布:hello world java 编辑:程序博客网 时间:2024/05/22 03:33

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7084802

邻接矩阵空间复杂度太大,对空间要求严格的可以参考我的,欢迎提出意见可怜

#include<iostream>#include<cstdlib>#include<cstdio>#include<queue>#include<algorithm>using namespace std;#define INF 1<<30const 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;}


原创粉丝点击