说句老实话,这种题做了也白做,中文的确实恶心啊,搞得我去要别人给我讲题意,哎,伤心啊。
其实就是那个m的限制就是要求在你这条路径上最大rank和最小的rank相差不超过m,得要用个数组来存下来进行控制。实在做不出来就算了,确实没多大意思,光浪费时间。(flag数组就是存rank的max和min的)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 101
#define inf 10000000
using namespace std;
int m,n;
int map[N][N];
int flag[N][2];
typedef struct{
int p,r;
}Node;
Node a[N];
bool vis[N];
int dis[N];
void dij()
{
int h = a[1].r;
int mi,ma;
memset(vis,true,sizeof(vis));
vis[1] = false;
int num = 0;
for(int i=2; i<=n; ++i)
if(abs(h-a[i].r) <= m)
{
flag[i][0] = h>a[i].r?a[i].r:h;
flag[i][1] = (h+a[i].r) - flag[i][0];
}
else
{
vis[i] = false;
dis[i] = inf;
++num;
}
dis[1] = a[1].p;
for(int i=2; i<=n; ++i)
if(vis[i])
dis[i] = map[1][i];
for(int i=1; i<=n-1-num; ++i)
{
int ma = inf, k = -1;
for(int e=2; e<=n; ++e)
if(vis[e]&&dis[e] < ma)
{
ma = dis[e];
k = e;
}
if(k == -1)
break;
vis[k] = false;
for(int j=2; j<=n; ++j)
if(vis[j]&&dis[k]+map[k][j] < dis[j])
{
if(flag[j][0]<=a[k].r&&a[k].r<=flag[j][1])
dis[j] = dis[k] + map[k][j];
else
{
if(a[k].r<flag[j][0]&&flag[j][1]-a[k].r<=m)
{
dis[j] = dis[k] + map[k][j];
flag[j][0] = a[k].r;
}
if(a[k].r>flag[j][1]&&a[k].r-flag[j][0]<=m)
{
dis[j] = dis[k] + map[k][j];
flag[j][1] = a[k].r;
}
}
}
}
}
int main()
{
cin >> m >> n;
for(int i=1; i<=n; ++i)
for(int e=i; e<=n; ++e)
map[i][e] = map[e][i] = inf;
for(int i=1; i<=n; ++i)
{
int num;
cin >> a[i].p >> a[i].r >> num;
for(int e=1; e<=num; ++e)
{
int x,y;
cin >> x >> y;
map[i][x] = y;
}
}
dij();
for(int i=2; i<=n; ++i)
dis[i] += a[i].p;
int ma = inf;
for(int i=1; i<=n; ++i)
if(ma > dis[i])
ma = dis[i];
cout << ma<<endl;
return 0;
}
本文介绍了一个基于Dijkstra算法的实现,该算法用于解决带有特定路径限制的问题。具体而言,算法确保路径上的节点排名差异不超过给定阈值m。通过使用额外的数据结构来跟踪路径的最大和最小排名,从而实现这一限制。
350

被折叠的 条评论
为什么被折叠?



