首页 > 代码库 > poj1062昂贵的聘礼

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\n",ans);
82 }

 

poj1062昂贵的聘礼