poj 1062 昂贵的聘礼 最短路

 

          中文题 题意就不说了,注意题目里说的是所有的人等级差不能超过一个值,而不是两个两个之间不能超过(这里题意搞错了wa半天),

 建好图,枚举可以在这个最短路里的最高级和最低级再跑最短路 得到最小值就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define INF 99999999
 7 struct node{int price,rank1;}p[1002];
 8 int g[102][102],d[102];
 9 bool vis[102];
10 
11 int dij(int s,int n,int min1,int max1)
12 {
13     int minn,mini;
14     for(int i=1;i<=n;i++)
15         d[i]=INF;
16     memset(vis,false,sizeof(vis));
17     d[s]=0;
18     for(int k=1;k<n;k++)
19     {
20         minn=INF;
21         for(int i=1;i<=n;i++)
22             if(!vis[i]&&d[i]<minn)
23             {
24                 minn=d[i];
25                 mini=i;
26             }
27         vis[mini]=true;
28         for(int i=1;i<=n;i++)
29             if(p[i].rank1>=min1&&p[i].rank1<=max1&&d[mini]+g[mini][i]<d[i])
30                 d[i]=d[mini]+g[mini][i];
31     }
32     minn=INF;
33     for(int i=1;i<=n;i++)
34     {
35         d[i]+=p[i].price;
36         if(minn>d[i])
37             minn=d[i];
38     }
39     return minn;
40 }
41 
42 int main()
43 {
44     int n,k,c,a,b;
45     while(~scanf("%d%d",&c,&n))
46     {
47         for(int i=0;i<=n;i++)
48             for(int j=0;j<=n;j++)
49                g[i][j]=INF;
50         for(int i=1;i<=n;i++)
51         {
52            scanf("%d%d%d",&p[i].price,&p[i].rank1,&k);
53            while(k--)
54            {
55                scanf("%d%d",&a,&b);
56                g[i][a]=min(b,g[i][a]);
57            }
58         }
59         int temp,ans=INF;
60         temp=p[1].rank1;
61         temp=max(p[1].rank1-c,0);
62         for(int i=temp;i<=p[1].rank1;i++)
63         {
64             int pp;
65             pp=dij(1,n,i,i+c);
66             if(pp<ans)
67                 ans=pp;
68         }
69         printf("%d\n",ans);
70     }
71 }

 

posted @ 2014-08-15 19:23  galaxy77  阅读(113)  评论(0编辑  收藏  举报