Dijkstra模板
Posted 君凌烟阁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra模板相关的知识,希望对你有一定的参考价值。
Dijkstra是求最短路径,从未选过点中找最短的一条路,然后更新其他点到起点的距离。例如选择的最短点为k,则dj[k]表示起点到k之间的距离,此时更新其他点到起点的距离,dj[j] = min(dj[j],dj[k]+dj[k][j]);dj[j]比较原来的长度与经过k掉再到j点的长度,取最小。
模板如下:
void Dijkstra() { memset(vis,0,sizeof(vis)); for(int i=0;i<=n;++i) dj[i] = Map[0][i]; vis[0] = 1; for(int i=1;i<=n;++i) { int mindj = INF; int pos; for(int j=1;j<=n;++j) { if(dj[j]<mindj&&!vis[j]) { mindj = dj[j]; pos = j; } } vis[pos] = 1; for(int j=1;j<=n;++j) { if(!vis[j] && dj[j] > dj[pos] + Map[pos][j]) dj[j] = dj[pos] + Map[pos][j]; } } }
hdu2066
由于多个起点,只要设置多个起点到0起点的距离为0即可。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF (1<<30) #define N (1000+100) int Map[N][N]; int n; int dj[N],vis[N]; void Dijkstra() { memset(vis,0,sizeof(vis)); for(int i=0;i<=n;++i) dj[i] = Map[0][i]; vis[0] = 1; for(int i=1;i<=n;++i) { int mindj = INF; int pos; for(int j=1;j<=n;++j) { if(dj[j]<mindj&&!vis[j]) { mindj = dj[j]; pos = j; } } vis[pos] = 1; for(int j=1;j<=n;++j) { if(!vis[j] && dj[j] > dj[pos] + Map[pos][j]) dj[j] = dj[pos] + Map[pos][j]; } } } int main() { int t,s,d; while(~scanf("%d%d%d",&t,&s,&d)) { n = 0; for(int i=0;i<N;++i) for(int j=0;j<N;++j) { if(i != j) Map[i][j] = INF; else Map[i][j] = 0; } for(int i=0;i<t;++i) { int a,b,time; scanf("%d%d%d",&a,&b,&time); Map[a][b] = Map[b][a] = min(Map[a][b],time); n = max(max(a,b),n); } int src[N],dst[N]; for(int i=0;i<s;++i) { scanf("%d",&src[i]); Map[0][src[i]] = 0; } for(int i=0;i<d;++i) scanf("%d",&dst[i]); Dijkstra(); int res = INF; for(int i=0;i<d;++i) res = min(res,dj[dst[i]]); printf("%d\n",res); } return 0; }
以上是关于Dijkstra模板的主要内容,如果未能解决你的问题,请参考以下文章