題意
分析
dijkstra的變形,問題在於把題目的邏輯轉化成圖。
這個圖是這樣的:V是各個人(禮物+承諾+探險家),E是花費的金額。如果能夠換到,就連一條邊。
這樣一來,對到的各個區間分別求最短路(m次),即可求出答案。
這道題目建模是關鍵。圖論的特徵。
程式碼
// Origin:
// Theme: Graph Theory (Basic)
// Date: 080618
// Author: Sam X
//#include <bits/stdc++.h>
#include <iostream>
#include <utility>
#include <iomanip>
#include <cstring>
#include <cmath>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ul;
typedef pair<int,int> pi;
typedef pair<int,pi> pii;
int main()
{
int m,n; cin>>m>>n;
int dis[105][105];
int lv[105];
memset(dis,0x3f,sizeof(dis));
rep(i,1,n)
{
dis[i][i]=0;
int p,l,x; cin>>p>>l>>x;
dis[0][i]=p;
lv[i]=l;
rep(j,1,x)
{
int t,v; cin>>t>>v;
dis[t][i]=v;
}
}
int ans=0x3f3f3f3f;
rep(llv,lv[1]-m,lv[1])
{
int rlv=llv+m,d[105];
memset(d,0x3f,sizeof(d));
d[0]=0;
int mind=d[1],x=-1;
bool vis[105];
ZERO(vis);
//cout<<"***\nllv="<<llv<<" rlv="<<rlv<<endl;
rep(i,0,n)
{
mind=0x3f3f3f3f;
x=-1;
rep(j,0,n) if(!vis[j] && d[j]<mind) mind=d[x=j];
if(x==-1) break;
//cout<<"x="<<x<<endl;
vis[x]=true;
rep(j,0,n)
{
if(j==0 || (lv[j]>=llv && lv[j]<=rlv))
{
d[j]=min(d[j],d[x]+dis[x][j]);
}
}
//rep(j,0,n) cout<<d[j]<<" "; cout<<endl;
}
ans=min(ans,d[1]);
}
cout<<ans<<endl;
return 0;
}