一、题目概述
验证给定的K个序列是否为Dijkstra序列
二、思路
对于每个序列,执行dijkstra算法求得单元最短路径距离。
若为Dijkstra序列,则序列中元素按照该距离非降序排列。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
#define INF 0x7FFFFFFF
int main()
{
int Nv, Ne, K;
scanf("%d %d", &Nv, &Ne);
vector<vector<int>> G(Nv + 1, vector<int>(Nv + 1, INF));
for( int i = 0, v1, v2, d; i < Ne; ++i )
{
scanf("%d %d %d", &v1, &v2, &d);
G[v1][v2] = G[v2][v1] = d;
}
scanf("%d", &K);
for( int i = 0, flag; i < K; ++i )
{
vector<int> a(Nv), dist(Nv + 1, INF), vset(Nv + 1, 0);
for( int j = 0; j < Nv; ++j )
scanf("%d", &a[j]);
dist[a[0]] = 0;
flag = 1;
for( int j = 0, v, Min; j < Nv; ++j )
{
Min = INF;
for( int k = 1; k <= Nv; ++k )
if( !vset[k] && dist[k] < Min )
{
v = k;
Min = dist[k];
}
if( Min == INF )
break;
vset[v] = 1;
for( int k = 1; k <= Nv; ++k )
if( G[v][k] != INF && dist[v] + G[v][k] < dist[k] )
dist[k] = dist[v] + G[v][k];
}
for( int j = 1; j < Nv && flag; ++j )
if( dist[a[j - 1]] > dist[a[j]] )
flag = 0;
printf("%s\n", flag ? "Yes":"No");
}
}