这题是个dijkstra算法,但是我还是做不对,因为这题还有等级限制。
后来看题解后要枚举冒险者的等级,但是我写的比较挫,还是过不去。
后来看了题解,要枚举每个物品的等级为当前的最高级,然后不满足条件的物品v=1;v=0的物品进行dijkstra,然后就是模板啦。
虽然看着说的挺轻松,自己想的时候是做了一晚上写不出,感觉看了题解恍然大悟的样子,看来还得多练习,来点变式就不会了。
#include<iostream> #include<cstdio> #include<cctype> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue> #include<map> #include<set> #include<sstream> #include<stack> using namespace std; #define MAX 100+5 typedef long long LL; const double pi=3.141592653589793; const int INF=1e8; const double inf=1e20; const double eps=1e-6; const int mod=1000000007; int mmap[MAX][MAX]; int deng[MAX]; int d[MAX],v[MAX]; int main(){ int m,n; scanf("%d%d",&m,&n); memset(deng,0,sizeof(deng)); memset(d,INF,sizeof(d)); memset(v,0,sizeof(v)); memset(mmap,0,sizeof(mmap)); for(int i=1;i<=n;i++){ int x,y,z; scanf("%d%d%d",&mmap[0][i],&deng[i],&x); for(int j=0;j<x;j++){ scanf("%d%d",&y,&z); mmap[y][i]=z; } } int maxn; int ans=INF; for(int i=1;i<=n;i++){ maxn=deng[i]; for(int j=1;j<=n;j++){ if(deng[j]>maxn||maxn-deng[j]>m) v[j]=1; else v[j]=0; } for(int i=1;i<=n;i++) d[i]=mmap[0][i]; for(int i=1;i<=n;i++){ int x=0,k=INF; for(int j=1;j<=n;j++) if(!v[j]&&d[j]<k){ k=d[j]; x=j; } if(x==0) break; v[x]=1; for(int j=1;j<=n;j++){ if(!v[j]&&mmap[x][j]) d[j]=min(d[j],d[x]+mmap[x][j]); } } if(ans>d[1]) ans=d[1]; } printf("%d\n",ans); return 0; }