Dijkstra模板

来源:互联网 发布:志愿者数据库 编辑:程序博客网 时间:2024/05/22 11:34

输入:

N个顶点

点u,点v以及u->v的权值

输入以-1 -1 -1结束


输出:

点0到点1~n-1的最短路径长度以及路径

————————————————————集训11.1的分割线————————————————————

代码如下:

/*ID: j.sure.1PROG:LANG: C++*//****************************************/#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <stack>#include <queue>#include <vector>#include <map>#include <string>#include <iostream>#define INF 0x7f7f7f7fusing namespace std;/****************************************/const int N = 20;int n, G[N][N], dis[N], fa[N];bool vis[N];void Dijkstra(){memset(vis, 0, sizeof(vis));memset(dis, 0x7f, sizeof(dis));dis[0] = 0;int cur = 0;for(int i = 0; i < n-1; i++) {int mini = INF;for(int k = 0; k < n; k++) if(!vis[k]) {if(dis[k] < mini) {mini = dis[k];cur = k;}}vis[cur] = true;for(int k = 0; k < n; k++) if(!vis[k]) {if(dis[k] > dis[cur] + G[cur][k]) {dis[k] = dis[cur] + G[cur][k];fa[k] = cur;}}}}int main(){#ifdef J_Sure//  freopen(".in", "r", stdin);//  freopen(".out", "w", stdout);#endifscanf("%d", &n);int u, v, w;while(scanf("%d%d%d", &u, &v, &w)!=EOF) {if(u == -1) break;G[u][v] = w;}for(int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {if(i == j)G[i][j] = 0;else if (!G[i][j])G[i][j] = INF;}}Dijkstra();int dir[N];fa[0] = 0;for(int i = 1; i < n; i++) {int x = i, cnt = 0;printf("%d\t", dis[i]);while(x != fa[x]) {dir[cnt++] = x;x = fa[x];}dir[cnt] = 0;for(int k = cnt; k > 0; k--) {printf("%d->", dir[k]);}printf("%d\n", dir[0]);}    return 0;}


0 0
原创粉丝点击