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;
}

 

 

 

 

 

 

 

 

posted @ 2013-08-11 19:56  龙城星  阅读(182)  评论(0编辑  收藏  举报