1062昂贵的聘礼
1.等级那里要用枚举,没有考虑到1(3)2(2)3(4)4(5)按照我的第一种做法的话,那么4号物品会被去掉,但是如果有一条线从3——2——1呢,3跟2不可以交易的
2.用了chang[],一开始枚举等级的时候,没有考虑到一种情况枚举后,他会改变chang数组
自己的代码(没有通过)
#include "iostream" #include "queue" #include "string.h" using namespace std; #define INF 0x7fffffff struct { int p,l,x; }thing[120]; struct{ int s,v,e; }chang[120],exchang[120]; int main(){ int m,n,top=0,set[120],i,j,flag=0,a=0,k,data[1000],min=INF; queue<int>Q; cin>>m>>n; for(i=1;i<=n;i++){ cin>>thing[i].p>>thing[i].l>>thing[i].x; for(j=0;j<thing[i].x;j++){ cin>>chang[flag].s>>chang[flag].v; chang[flag].e=i; flag++; } } for(i=0;i<flag;i++){exchang[i]=chang[i];} for(k=thing[1].l-m;k<=thing[1].l;k++){ for(i=0;i<flag;i++){chang[i]=exchang[i];} top=0; memset(set,0,sizeof(set)); for(i=1;i<=n;i++){ if(thing[i].l>k+m||thing[i].l<k) set[i]=1; } for(i=0;i<flag;i++){ if(!set[chang[i].s]&&!set[chang[i].e]){ chang[top].s=chang[i].s; chang[top].e=chang[i].e; chang[top].v=chang[i].v; top++; } } for(i=top-1;i>=0;i--){ if(thing[chang[i].e].p>thing[chang[i].s].p+chang[i].v){ thing[chang[i].e].p=thing[chang[i].s].p+chang[i].v; } } data[a++]=thing[1].p; } for(i=0;i<a;i++){ if(data[i]<min)min=data[i]; } cout<<min<<endl; }
我也不知道错在哪里,自己想了很多例子都通过了丫,不过还是wr,以后再回来看看是什么问题吧
网上的答案
#include <stdio.h> #include <string.h> #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) #define INF 0x7fffffff #define N 101 int g[N][N],dist[N],val[N],rank[N],n,m; char vis[N]; void dijkstra(int u,int s) { int v,i,min,k; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) dist[i]=(i==u?0:INF); for(i=0;i<n;i++) { min=INF; for(v=0;v<n;v++) { if(!vis[v]&&dist[v]<=min&&rank[v]>=s&&rank[v]<=s+m) min=dist[k=v]; } vis[k]=1; if(min==INF) break; for(v=0;v<n;v++) { if(rank[v]>=s&&rank[v]<=s+m&&g[k][v]!=INF&&dist[v]>=dist[k]+g[k][v]) dist[v]=dist[k]+g[k][v]; } } } int main() { int i,j,k,a,b,s,tmp,ans; while(~scanf("%d%d",&m,&n)) { for(i=0;i<n;i++) { for(j=i+1;j<n;j++) g[i][j]=g[j][i]=INF; } for(i=0;i<n;i++) { scanf("%d%d%d",&val[i],&rank[i],&k); for(j=0;j<k;j++) { scanf("%d%d",&a,&b),a--; g[i][a]=MIN(g[i][a],b); } } ans=INF; s=MAX(rank[0]-m,0); for(i=s;i<=rank[0];i++) { dijkstra(0,i); tmp=val[0]; for(j=1;j<n;j++) { if(dist[j]==INF) continue; tmp=MIN(tmp,dist[j]+val[j]); } ans=MIN(ans,tmp); } printf("%d\n",ans); } return 0; }