研究了好久。。。最后看了大牛的思路才写出来
#include <iostream>
#include <string.h>#include <stdio.h>
using namespace std;
int thing[100000 + 10];
int map[105][105];
bool vis[105];
bool ok[105];
int N,M,K,P,L,T,V,X;
int dis[105];
int dij()
{
memset(dis, 0x1f1f, sizeof(dis));
memset(vis, 0, sizeof(vis));
for( int i = 0; i<= N ;i++)
dis[i] = map[1][i];
vis[1] = true;
//for( int j = 0; j<= N ;j++)
// cout<<dis[j]<<endl;
for( int i = 0; i<= N; i++)
{
int minx = 0x1f1f;
int pos = 1;
for( int j = 0 ; j <= N ;j++)
{
if( !vis[j] && minx > dis[j] && ok[j])
{
minx = dis[j];
pos = j;
}
}
vis[pos] = true;
for( int j = 0; j<= N ; j++)
{
if(!vis[j] && ok[j] && dis[j] > dis[pos] + map[pos][j])
{
dis[j] = dis[pos] + map[pos][j];
//cout<<j<<"____________"<<dis[j]<<"dis[j]"<<endl;
}
}
}
//cout<<dis[0]<<endl;
return dis[0];
}
int main()
{
while(scanf("%d %d",&M, &N)!=EOF)
{
memset(map, 0x1f1f, sizeof(map));
for( int i = 1; i<= N; i++)
{
scanf("%d %d %d",&P, &L, &X);
thing[i] = L;
map[i][0] = P;
for( int j = 1; j <= X; j++)
{
scanf("%d %d",&T, &V);
map[i][T] = V;
}
}
int minx = 100000;
for( int i = 0; i <= M ; i++)
{
memset(ok,0,sizeof(ok));
for( int j = 1; j <= N ;j++)
{
if(thing[j] >= thing[1] - M + i && thing[j] <= thing[1] + i)
{
ok[j] = true;
//cout<<"k"<<j<<endl;
}
else
ok[j] = false;
}
ok[0] = true;
int res = dij();
if(minx > res)
minx = res;
}
printf("%d\n",minx);
}
return 0;
}