输入:
N个顶点
点u,点v以及u->v的权值
输入以-1 -1 -1结束
输出:
点0到点1~n-1的最短路径长度以及路径
————————————————————集训11.1的分割线————————————————————
代码如下:
/*
ID: j.sure.1
PROG:
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 0x7f7f7f7f
using 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);
#endif
scanf("%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;
}