POJ1062(昂贵的聘礼)

题目链接

最短路的题,与一般的最短路不同的是,建图后每个结点有一个等级值(一个非负整数),要求最短路并且路线上的结点的最大等级差不超过给定值。

这题一开始我想到的就是枚举等级区间,在对应区间内用dijkstra求最短路,复杂度是L*N2,L是给定的最大等级差,N为结点数,由于题中L的最大值没有给出,所以我担心会超时,写好后提交是WA而不是TLE,这也让我确定了此法的可行性。经检查发现导致WA的错误:

1.建图错误,按题意应建有限图;

2.有一个两重循环的下标重复了;

3.松弛的时候忘了检查结点等级。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX(a,b) ((a)>(b)?(a):(b))
 4 #define MIN(a,b) ((a)<(b)?(a):(b))
 5 #define INF 0x7fffffff
 6 #define N 101
 7 int g[N][N],dist[N],val[N],rank[N],n,m;
 8 char vis[N];
 9 void dijkstra(int u,int s)
10 {
11     int v,i,min,k;
12     memset(vis,0,sizeof(vis));
13     for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
14     for(i=0;i<n;i++)
15     {
16         min=INF;
17         for(v=0;v<n;v++)
18         {
19             if(!vis[v]&&dist[v]<=min&&rank[v]>=s&&rank[v]<=s+m)   min=dist[k=v];
20         }
21         vis[k]=1;
22         if(min==INF)    break;
23         for(v=0;v<n;v++)
24         {
25             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];
26         }
27     }
28 }
29 int main()
30 {
31     int i,j,k,a,b,s,tmp,ans;
32     while(~scanf("%d%d",&m,&n))
33     {
34         for(i=0;i<n;i++)
35         {
36             for(j=i+1;j<n;j++)    g[i][j]=g[j][i]=INF;
37         }
38         for(i=0;i<n;i++)
39         {
40             scanf("%d%d%d",&val[i],&rank[i],&k);
41             for(j=0;j<k;j++)
42             {
43                 scanf("%d%d",&a,&b),a--;
44                 g[i][a]=MIN(g[i][a],b);
45             }
46         }
47         ans=INF;
48         s=MAX(rank[0]-m,0);
49         for(i=s;i<=rank[0];i++)
50         {
51             dijkstra(0,i);
52             tmp=val[0];
53             for(j=1;j<n;j++)
54             {
55                 if(dist[j]==INF)    continue;
56                 tmp=MIN(tmp,dist[j]+val[j]);
57             }
58             ans=MIN(ans,tmp);
59         }
60         printf("%d\n",ans);
61     }
62     return 0;
63 }

 

posted @ 2012-04-22 13:40  BeatLJ  阅读(255)  评论(0编辑  收藏  举报