zoukankan      html  css  js  c++  java
  • poj1062昂贵的聘礼

    题目链接:http://poj.org/problem?id=1062

    再一次被题意坑了,这次还是中文题。。。。。。

    看的题解。

    地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。
    但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。
    也就是说:同一条路径上的任意两个人,等级差不能超过M。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #define ll long long
     5 using namespace std;
     6 const int maxn=110;
     7 const int inf=0x3f3f3f3f;
     8 int n,m;
     9 struct edge
    10 {
    11     int v,w,nex;
    12 }e[maxn*maxn];
    13 int head[maxn];
    14 int cnt;
    15 int dis[maxn];
    16 int sta[maxn];
    17 int ins[maxn];
    18 int rk[maxn];
    19 
    20 void add(int u,int v,int w)
    21 {
    22     e[cnt].v=v;
    23     e[cnt].w=w;
    24     e[cnt].nex=head[u];
    25     head[u]=cnt++;
    26 }
    27 
    28 int  spfa(int s,int r)
    29 {
    30     for(int i=0;i<=n;i++)
    31     {
    32         dis[i]=inf;
    33         ins[i]=0;
    34     }
    35     dis[s]=0;
    36     ins[s]=1;
    37     int top=0;
    38     sta[top++]=s;
    39     while(top)
    40     {
    41         int u=sta[--top];
    42         ins[u]=0;
    43         for(int i=head[u];i!=-1;i=e[i].nex)
    44         {
    45             int v=e[i].v;
    46             if(rk[v]>m+r||rk[v]<r) continue;
    47             int w=e[i].w;
    48             if(dis[v]>dis[u]+w)
    49             {
    50                 dis[v]=dis[u]+w;
    51                 if(!ins[v])
    52                 {
    53                     ins[v]=1;
    54                     sta[top++]=v;
    55                 }
    56             }
    57         }
    58     }
    59     return dis[1];
    60 }
    61 
    62 int main()
    63 {
    64     scanf("%d%d",&m,&n);
    65     int p,x,y;
    66     cnt=0;
    67     memset(head,-1,sizeof(head));
    68     for(int i=1;i<=n;i++)
    69     {
    70         scanf("%d%d%d",&p,&rk[i],&x);
    71         add(0,i,p);
    72         for(int j=0;j<x;j++)
    73         {
    74             scanf("%d%d",&y,&p);
    75             add(y,i,p);
    76         }
    77     }
    78     int ans=inf;
    79     for(int i=1;i<=n;i++) //枚举等级
    80         ans=min(ans,spfa(0,rk[i]));
    81     printf("%d
    ",ans);
    82 }
  • 相关阅读:
    DShow实现一个avi视频的播放(含有个人解释和注释)
    指针和引用的区别
    从头看算法导论 习题2.3-7 深入分析
    程序员福利各大平台免费接口,非常适用
    NYOJ 58 最少步数
    NYOJ 42 一笔画问题
    NYOJ 1058 部分和问题
    NYOJ 21 三个水杯
    winform里面网页显示指定内容
    C#中List<T>对象的深度拷贝问题
  • 原文地址:https://www.cnblogs.com/yijiull/p/6616084.html
Copyright © 2011-2022 走看看