题目链接:点击打开链接
思路:
本题是求单源最短路径,适合用dijkstra算法,枚举每一个人的地位当做最小地位,分别求出到第一个人的最短距离,再从中取最小值。
代码:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int M, N, tol, dis[110], level[110], edge[110][110], P[110];
bool vis[110];
const int inf = 0x3f3f3f3f;
void dijkstra()
{
for(int i = 1;i <= N;i++)
dis[i] = P[i];
for(int i = 1;i <= N;i++)
{
int Min = inf, u;
for(int j = 1;j <= N;j++)
{
if(!vis[j] && dis[j] < Min)
Min = dis[j], u = j;
}
vis[u] = true;
for(int j = 1;j <= N;j++)
{
if(!vis[j] && dis[j] > dis[u] + edge[u][j])
dis[j] = dis[u] + edge[u][j];
}
}
}
int main()
{
cin>>M>>N;
int L, X, T, V, Min = inf;
memset(edge,inf,sizeof(edge));
tol = 0;
for(int i = 1;i <= N;i++)
{
cin>>P[i]>>L>>X;
level[i] = L;
edge[0][i] = P[i];
while(X--)
{
cin>>T>>V;
edge[T][i] = V;
}
}
for(int i = 1;i <= N;i++)
{
int minlevel = level[i];
for(int j = 1;j <= N;j++)
if(level[j] - minlevel > M||minlevel > level[j])
vis[j] = true;
else
vis[j] = false;
dijkstra();
Min = min(Min,dis[1]);
}
cout<<Min<<endl;
return 0;
}