#include <iostream>
#include <cstring>
using namespace std;
const int N=200+10;
int g[N][N];
const int fill_val=0x3f;
const int INF=0x3f3f3f3f;
int dis[N];
int level[N];
bool vis[N];
int m,n;
int res=INF;
bool valid(int val,int l,int r)
{
return val>=l&&val<=r;
}
int dijksra(int l,int r)
{
memset(dis,fill_val,sizeof dis);
memset(vis,0,sizeof vis);
dis[n+1]=0;
for(int i=0;i<n+1;i++)
{
int t=-1;
for(int j=1;j<=n+1;j++)
{
if(!vis[j]&&(t==-1||dis[j]<dis[t]))
{
t=j;
}
}
vis[t]= true;
for(int j=1;j<=n+1;j++)
{
if (valid(level[t],l,r)&&valid(level[j],l,r)&&dis[t]+g[t][j]<dis[j])
{
dis[j]=dis[t]+g[t][j];
}
}
}
return dis[1];
}
int main()
{
memset(g,fill_val,sizeof g);
cin>>m>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>g[n+1][i]>>level[i]>>x;
for(int j=0;j<x;j++)
{
int id,price;
cin>>id>>price;
g[id][i]=price;
}
}
level[n+1]=level[1];
for(int i=level[1]-m;i<=level[1];i++)
{
// cout<<dijksra(i,i+m)<<endl;
res=min(res,dijksra(i,i+m));
}
cout<<res;
return 0;
}
本题坑点:
不能在这里进行合法性的判断,因为有可能t==-1,如果要在这里进行合法性的判断,如果最后t==-1就要退出,因为没有合法的了。