POJ - 1062 昂贵的聘礼 (最短路)
题目链接: POJ - 1062 昂贵的聘礼
要注意等级限制所以枚举可行的等级
#include<iostream> #include<cstring> #include<vector> #include<queue> #include<cmath> #include<math.h> using namespace std; #define maxn 1000 #define inf 0x3f3f3f3f struct ac{ int va,lv; ac(){} ac(int b,int c){ va=b,lv=c; } }a[maxn]; struct wa{ int to,va; wa(){} wa(int a,int b){ to=a,va=b; } }; vector<wa>q[maxn]; int n,m; int dis[maxn],levl[maxn]; bool fa[maxn],ffa[maxn];int spfa(int l,int r){ memset(fa,0,sizeof(fa)); memset(dis,inf,sizeof(dis)); queue<int>qq; dis[1]=0; levl[1]=a[1].lv; qq.push(1); while(!qq.empty()){ int u=qq.front(); qq.pop(); fa[u]=0; for(int j=0;j<q[u].size();j++){ wa x=q[u][j]; int i=a[x.to].lv; int ii=a[u].lv; int v=x.to; int va=x.va; if(i>=l&&i<=r){ if(dis[v]>dis[u]+va){ dis[v]=dis[u]+va; if(!fa[v]){ fa[v]=1; qq.push(v); } } } } } int ans=inf; for(int j=1;j<=m;j++){ ans=min(dis[j]+a[j].va,ans); } return ans; } int main(){ cin>>n>>m; for(int j=1;j<=m;j++){ int va,lv,t; cin>>va>>lv>>t; a[j]=ac(va,lv); for(int k=0;k<t;k++){ int a,b; cin>>a>>b; q[j].push_back(wa(a,b)); } } int ans=inf; for(int j=a[1].lv-n;j<=a[1].lv;j++){ ans=min(ans,spfa(j,j+n)); } cout<<ans<<endl; } /* 1 4 10000 3 2 2 1 3 3 1000 2 2 4 1 3 1 1000 3 1 4 2 100 4 0
105 */