POJ 1062 昂贵的聘礼

中文题题意请看题

因为数据范围比较小,所以直接枚举等级上届和下届,然后对于在这个等级范围内的人所建的图跑最短路

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=102;
int s[N][N];
int dis[N],lev[N],val[N];
bool vis[N],ok[N];
int n,m;
queue<int>q;
int spfa()
{
  int ret=inf;
  memset(dis,inf,sizeof(dis));
  dis[1]=0;
  q.push(1);
  while(!q.empty())
    {
      int u=q.front();vis[u]=0;q.pop();
      for(int v=1;v<=n;v++)
    {
      if(!ok[v]||u==v) continue;
      if(dis[v]>dis[u]+s[u][v])
        {
          dis[v]=dis[u]+s[u][v];
          if(!vis[v])q.push(v),vis[v]=1;
        }
    }
    }
  for(int i=1;i<=n;i++) ret=min(ret,dis[i]+val[i]);
  return ret;
}
int main()
{
  scanf("%d%d",&m,&n);
  memset(s,inf,sizeof(s));
  for(int i=1,x;i<=n;i++)
    {
      scanf("%d%d%d",&val[i],&lev[i],&x);
      for(int j=1,v,w;j<=x;j++)
    {
      scanf("%d%d",&v,&w);
      s[i][v]=w;
    }
    }
  int ans=inf;
  for(int i=0;i<=m;i++)
    {
      memset(ok,0,sizeof(ok));
      for(int j=1;j<=n;j++)
    {
      if(lev[j]>=lev[1]-m+i&&lev[j]<=lev[1]+i) ok[j]=true;
    }
      ans=min(ans,spfa());
    }
  printf("%d\n",ans);
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/pigba/p/8989548.html