2011/07/14 12:46
题目地址:http://poj.org/problem?id=1062
#include<iostream>
#define N 105
using namespace std;
//Dijkstra
const int INF= 0X7fffffff;
int d[N],money[N],level[N],w[N][N];
int n;
int Dijkstra(int min,int max)
{
int i,j,ii,mm;
int flag[N]={0};
d[0]=0;
for(i=1;i<=n;i++) d[i]=money[i];
for(i=1;i<=n;i++) if(level[i]<min||level[i]>max) flag[i]=1;
for(i=0;i<n;i++)
{
mm = INF;
for(j=1;j<=n;j++) {
if(!flag[j]&&mm>d[j]){
mm=d[j];
ii=j;
}
}
flag[ii]=1;
//cout<<ii<<endl;
if(ii==1) return d[ii];
for(j=1;j<=n;j++){
if(w[ii][j]>0){
if(d[j]>d[ii]+w[ii][j])
d[j]=d[ii]+w[ii][j];
// cout<<ii<<" "<<j<<" "<<d[j]<<endl;
}
}
}
return d[1];
}
int main()
{
int i,j,m,p,x;
while(~scanf("%d%d",&m,&n))
{
int ans = INF;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) w[i][j]=-1;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",money+i,level+i,&x);
while(x--)
{
scanf("%d%d",&j,&p);
w[j][i]=p;
}
}
for(i=level[1]-m;i<=level[1];i++)
{
int temp = Dijkstra(i,i+m); //cout<<temp<<endl;
if(temp<ans) ans =temp;
}
printf("%d\n",ans);
}
return 0;
}