圖論-最短路-迪傑斯特拉演算法
阿新 • • 發佈:2018-12-22
圖論–最短路–Dijkstra(迪傑斯特拉)演算法 及 堆優化
1.陣列:
#include<cstdio>
#include<cstring>
const int maxn=100;
int map[maxn][maxn];
int dis[maxn];
int path[maxn];
bool vis[maxn];
int n;
void dijk(int s) /// s 起點
{
memset(path,-1,sizeof(path));
memset(dis,0x3f,sizeof(dis)); ///快速初始化為無窮大
memset(vis, 0,sizeof(vis));
dis[s]=0;
while(1)
{
int k=0;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<dis[k]) ///這一步找未收錄頂點中dis值最小的
k=j;
}
if(k==0) return;
vis[k]=1; ///收錄頂點k
for(int j=1;j<= n;j++)
{
if(dis[j]>dis[k]+map[k][j])
{
dis[j]=dis[k]+map[k][j];
path[j]=k;
}
}
}
}
void print(int x)
{
if(x==-1) return ;
print(path[x]);
printf("%d->",x);
}
int main()
{
int m,x,y,z,order;
scanf ("%d%d",&n,&m);
memset(map,0x3f,sizeof(map));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=z;
}
dijk(1);
scanf("%d",&order);
printf("%d\n",dis[order]);
print(path[order]);
printf("%d",order);
return 0;
}
2.堆優化
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int Ni = 10000;
const int INF = 1<<27;
struct node{
int to,w;
node(){}
node(int a,int b){to=a;w=b;}
bool operator < (const node & a) const
{
if(w==a.w) return to<a.to;
else return w > a.w;
}
};
vector<node> eg[Ni];
int dis[Ni],n;
void Dijkstra(int s)
{
int i;
for(i=0;i<=n;i++) dis[i]=INF;
dis[s]=0;
priority_queue<node> q; /// 用優先佇列優化 優先佇列 預設升序
q.push(node(s,dis[s])); /// 起點
while(!q.empty())
{
node x=q.top();q.pop();
for(i=0;i<eg[x.to].size();i++)
{
node y=eg[x.to][i];
if(dis[y.to]>x.w+y.w)
{
dis[y.to]=x.w+y.w;
q.push(node(y.to,dis[y.to]));
}
}
}
}
int main()
{
int a,b,w,m;
while(scanf("%d%d",&n,&m),n+m)
{
for(int i=0;i<=n;i++) eg[i].clear();
while(m--)
{
scanf("%d%d%d",&a,&b,&w);
eg[a].push_back(node(b,w));
eg[b].push_back(node(a,w));
}
Dijkstra(1);
printf("%d\n",dis[n]);
}
return 0;
}