邻接矩阵空间复杂度太大,对空间要求严格的可以参考我的,欢迎提出意见
#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;
}