您的位置:首页 > 其它

Dijkstra单源最短路,邻接矩阵形式(模板)

2016-08-22 19:34 369 查看
/*
单元最短路径,Dijkstra算法,邻接矩阵形式,复杂度为O(n^2)
求出源beg到所有点的最短路径,传入图的顶点数和邻接矩阵cost[][]
返回各点的最短路径lowcost[],路径pre[],pre[i]记录beg到i路径上的父结点,pre[beg]=-1
可以更改路径权类型,但权值必须为非负
*/
#include<iostream>
#include<cstdio>
#include<string.h>
#include<fstream>
using namespace std;

const int MAXN=1010;
#define typec int
const typec INF=0x3f3f3f3f;
bool vis[MAXN];
int pre[MAXN];

void Dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg)
{
for(int i=0;i<n;i++)
{
lowcost[i]=INF;
vis[i]=false;
pre[i]=-1;
}
lowcost[beg]=0;
for(int j=0;j<n;j++)
{
int k=-1;
int Min=INF;
for(int i=0;i<n;i++)
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
if(k==-1) break;
vis[k]=true;
for(int i=0;i<n;i++)
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
{
lowcost[i]=lowcost[k]+cost[k][i];
pre[i]=k;
}
}
}

int main()
{
freopen("in.txt","r",stdin);
int n;
cin>>n;
typec cost
[MAXN];
typec lowcost
;
int e;
cin>>e;
memset(cost,INF,sizeof(cost));
for(int i=0;i<e;i++)
{
int x,y;
cin>>x>>y;
cin>>cost[x][y];
}
Dijkstra(cost,lowcost,n,0);
for(int i=0;i<=n-1;i++)
cout<<lowcost[i]<<" ";
cout<<endl;
for(int i=0;i<=n-1;i++)
cout<<pre[i]<<" ";
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: