又是一道难得的中文题。
思路: 利用Dijkstra算法, 求 最短路径;
一开始 对 Dijkstra算法 理解不太到位,导致wa一次;
然后 再做 仍然wa ,因为 自以为 酋长的等级一定是最高的 - -;
对 等级范围 取值 枚举 ,重复求 最短路径, AC
#include <iostream>
using namespace std;
const int M = 101;
int dis[M],map[M][M],l[M],dist[M];
int n,m;
int Dijkstra(int Min, int Max)
{
int count=0,i,f,mindis;
bool flag[M] = {0};
memcpy(dis, dist, sizeof(dis));
for(i=0; i<n; i++)
if(l[i]>Max || l[i]<Min) flag[i] = true;
while(count<n)
{
for(i=0,mindis=99999999,f=0; i<n; i++)
{
if(mindis>dis[i]&&!flag[i])
{
mindis = dis[i];
f = i;
}
}
if(f==0) return dis[0];
flag[f] = true; count++;
for(i=0; i<n; i++)
{
if(dis[i] > map[i][f]+dis[f] && map[i][f]!=-1)
dis[i] = map[i][f]+dis[f];
}
}
return dis[0];
}
int main()
{
int i,x,t,v;
while(scanf("%d %d", &m, &n)!=EOF)
{
int ans = 9999999;
memset(map, -1,sizeof(map));
for(i=0; i<n; i++)
{
scanf("%d %d %d", &dist[i], &l[i], &x);
while(x--)
{
scanf("%d %d", &t, &v);
map[i][t-1]=v;
}
}
for(i=l[0]-m; i<=l[0]; i++)
{
int t = Dijkstra(i, i+m);
if(ans > t) ans = t;
}
printf("%d\n", ans);
}
return 0;
}