这个题寒假的时候就遇见了--一直不会写--
题目链接:1062
汉语题--题意就不说了---
就相当于从0点到1点的最短距离---
从0点到(1-n)点的距离都有--
1-n点之间有一些路(单向路)
有一个约束条件M
即在最短路上最大的等级与最小的等级之差小于等于M---
点就100个
我们枚举枚举一个最大等级--求出在每一个最大等级所满足的条件下的最短路--
时间复杂度O(N^3)
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int deep[120];
int map[120][120];
int dis[120];
bool fafe[120],val[120];
void init()
{
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
map[i][j]=1111111111;
}
int disk()
{
memset(fafe,true,sizeof(fafe));
for (int i=1;i<=n;i++)
if (val[i]) dis[i]=map[0][i];
else dis[i]=1111111111;
while (1)
{
int mi=1111111112,ii;
for (int i=1;i<=n;i++)
if (fafe[i]&&mi>dis[i])
mi=dis[i],ii=i;
if (ii==1) return mi;
fafe[ii]=false;
if (val[ii])
for (int i=1;i<=n;i++)
if (val[i]&&fafe[i]&&dis[i]>map[ii][i]+dis[ii])
dis[i]=map[ii][i]+dis[ii];
}
}
int main()
{
int a,b,k;
scanf("%d%d",&m,&n);
init();
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&deep[i],&k);
map[0][i]=a;
while (k--)
{
scanf("%d%d",&a,&b);
map[a][i]=b;
}
}
int ans=1111111111;
for (int i=1;i<=n;i++)
{
int ma=deep[i];
for (int j=1;j<=n;j++)
{
if (deep[j]>ma||ma-deep[j]>m)
val[j]=false;
else
val[j]=true;
}
int ss=disk();
ans=min(ss,ans);
}
printf("%d\n",ans);
return 0;
}