ACM PKU 1062 昂贵的聘礼

题目描述:http://poj.org/problem?id=1062

所有给的测试数据都过了,就是一直wa,百思不得其解啊!

  1 #include <iostream>
2 #include <string.h>
3 #include <stdio.h>
4 const int inf=1000000;
5 const int maxn=105;
6 using namespace std;
7
8 struct node
9 {
10 int weight,rank;
11 } point[maxn];
12
13 int M,N;
14 int G[maxn][maxn];
15 int dist[maxn];
16 bool mark[maxn];
17
18 int dijkstra( int down ,int up)
19 {
20 int i,j,w,minc,ans=inf;
21 for (i=1; i<=N; i++)
22 {
23 mark[i]=0;
24 dist[i]=G[1][i];
25 }
26 mark[1]=1;
27 for (i=1; i<N; i++)
28 {
29 minc=inf,w=1;
30 for (j=2; j<=N; j++)
31 if ((mark[j]==0)&&(minc>=dist[j])&&(point[j].rank>=down)&&(point[j].rank<=up))
32 {
33 minc=dist[j];
34 w=j;
35 }
36 if(i==1&&w==1) return point[1].weight;
37 mark[w]=1;
38 for (j=2; j<=N; j++)
39 if ((mark[j]==0)&&(dist[j]>dist[w]+G[w][j])&&(point[j].rank>=down)&&(point[j].rank<=up))
40 {
41 dist[j]=dist[w]+G[w][j];
42 }
43 }
44 for(int i=2; i<=N; i++)
45 {
46 if(ans>dist[i]+point[i].weight) ans=dist[i]+point[i].weight;
47 }
48 return ans;
49 }
50
51 int main()
52 {
53 freopen("in.txt","r",stdin);
54 while(scanf("%d%d",&M,&N)==2)
55 {
56 memset(G,127,sizeof(G));
57 for(int i=1; i<=N; i++)
58 {
59 int tmp;
60 scanf("%d%d%d",&point[i].weight,&point[i].rank,&tmp);
61 for(int j=0; j<tmp; j++)
62 {
63 int to,v;
64 scanf("%d%d",&to,&v);
65 G[i][to]=v;
66 }
67 }
68 int ans=inf;
69 for(int i=point[1].rank-M; i<=point[1].rank; i++)
70 {
71 int temp=dijkstra(i,i+M);
72 ans=temp<ans?temp:ans;
73 }
74 ans=ans<point[1].weight?ans:point[1].weight;
75 printf("%d\n",ans);
76 }
77 return 0;
78 }
79 #include <iostream>
80 #include <string.h>
81 #include <stdio.h>
82 const int inf=1000000;
83 const int maxn=105;
84 using namespace std;
85
86 struct node
87 {
88 int weight,rank;
89 } point[maxn];
90
91 int M,N;
92 int G[maxn][maxn];
93 int dist[maxn];
94 bool mark[maxn];
95
96 int dijkstra( int down ,int up)
97 {
98 int i,j,w,minc,ans=inf;
99 for (i=1; i<=N; i++)
100 {
101 mark[i]=0;
102 dist[i]=G[1][i];
103 }
104 mark[1]=1;
105 for (i=1; i<N; i++)
106 {
107 minc=inf,w=1;
108 for (j=2; j<=N; j++)
109 if ((mark[j]==0)&&(minc>=dist[j])&&(point[j].rank>=down)&&(point[j].rank<=up))
110 {
111 minc=dist[j];
112 w=j;
113 }
114 if(i==1&&w==1) return point[1].weight;
115 mark[w]=1;
116 for (j=2; j<=N; j++)
117 if ((mark[j]==0)&&(dist[j]>dist[w]+G[w][j])&&(point[j].rank>=down)&&(point[j].rank<=up))
118 {
119 dist[j]=dist[w]+G[w][j];
120 }
121 }
122 for(int i=2; i<=N; i++)
123 {
124 if(ans>dist[i]+point[i].weight) ans=dist[i]+point[i].weight;
125 }
126 return ans;
127 }
128
129 int main()
130 {
131 freopen("in.txt","r",stdin);
132 while(scanf("%d%d",&M,&N)==2)
133 {
134 memset(G,127,sizeof(G));
135 for(int i=1; i<=N; i++)
136 {
137 int tmp;
138 scanf("%d%d%d",&point[i].weight,&point[i].rank,&tmp);
139 for(int j=0; j<tmp; j++)
140 {
141 int to,v;
142 scanf("%d%d",&to,&v);
143 G[i][to]=v;
144 }
145 }
146 int ans=inf;
147 for(int i=point[1].rank-M; i<=point[1].rank; i++)
148 {
149 int temp=dijkstra(i,i+M);
150 ans=temp<ans?temp:ans;
151 }
152 ans=ans<point[1].weight?ans:point[1].weight;
153 printf("%d\n",ans);
154 }
155 return 0;
156 }

  

posted on 2011-08-15 09:52  _Clarence  阅读(142)  评论(0编辑  收藏  举报

导航