1062

1 /*
2 可以用SPFA,把交易区间M内的点拿出来枚举一下就可以了
3 巧妙的构图,把每一个物品的原始价格转变为一条额外的边,可以转化为最短路问题了
4 */
5
6 // include file
7 #include <cstdio>
8 #include <cstdlib>
9 #include <cstring>
10 #include <cmath>
11 #include <cctype>
12 #include <ctime>
13
14 #include <iostream>
15 #include <sstream>
16 #include <fstream>
17 #include <iomanip>
18 #include <bitset>
19 #include <strstream>
20
21 #include <algorithm>
22 #include <string>
23 #include <vector>
24 #include <queue>
25 #include <set>
26 #include <list>
27 #include <functional>
28
29 using namespace std;
30
31 // typedef
32 typedef long long LL;
33 typedef unsigned long long ULL;
34
35 //
36 #define read freopen("in.txt","r",stdin)
37 #define write freopen("out.txt","w",stdout)
38 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
39 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
40 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
41 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
42
43 #define FF(i,a) for(int i=0;i<(a);i+++)
44 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
45 #define Z(a) (a<<1)
46 #define Y(a) (a>>1)
47
48 const double eps = 1e-6;
49 const double INFf = 1e10;
50 const int INFi = 1000000000;
51 const double Pi = acos(-1.0);
52
53 template<class T> inline T sqr(T a){return a*a;}
54 template<class T> inline T TMAX(T x,T y)
55 {
56 if(x>y) return x;
57 return y;
58 }
59 template<class T> inline T TMIN(T x,T y)
60 {
61 if(x<y) return x;
62 return y;
63 }
64 template<class T> inline void SWAP(T &x,T &y)
65 {
66 T t = x;
67 x = y;
68 y = t;
69 }
70 template<class T> inline T MMAX(T x,T y,T z)
71 {
72 return TMAX(TMAX(x,y),z);
73 }
74
75
76 // code begin
77 #define MAXN 110
78
79 struct node
80 {
81 int e;
82 int p;
83 };
84 vector<node> G[MAXN];
85 int dj[MAXN];
86 int djmin,djmax;
87 bool used[MAXN];
88 int dst[MAXN];
89 bool isin[MAXN];
90 int M,N,P,L,X;
91 int ans;
92
93 void spfa()
94 {
95 //
96 FORi(1,N+2,1) dst[i] = INFi;
97 dst[N+1] = 0;
98 memset(isin,0,sizeof(isin));
99 isin[N+1] = true;
100 queue<int> qi;
101 qi.push(N+1);
102
103 while(!qi.empty())
104 {
105 int cur = qi.front();
106 qi.pop();
107
108 isin[cur] = false;
109
110 FORi(0,G[cur].size(),1)
111 {
112 if( used[ G[cur][i].e ] )
113 {
114 if( dst[cur]+G[cur][i].p<dst[ G[cur][i].e ] )
115 {
116 dst[ G[cur][i].e ] = dst[cur]+G[cur][i].p;
117 if( !isin[ G[cur][i].e ] )
118 {
119 isin[ G[cur][i].e ] = 1;
120 qi.push( G[cur][i].e );
121 }
122 }
123 }
124 }
125 }
126
127 if(dst[1]<ans)
128 ans=dst[1];
129 }
130
131 int main()
132 {
133 read;
134 write;
135 int a,b;
136 while(scanf("%d %d",&M,&N)!=-1)
137 {
138 FORi(1,N+2,1)
139 {
140 G[i].clear();
141 }
142 djmin = INFi;
143 djmax = 0;
144 FORi(1,N+1,1)
145 {
146 scanf("%d %d %d",&P,&L,&X); // 价格,等级,替代
147 node t;
148 t.e = i;
149 t.p = P;
150 G[N+1].push_back(t);
151 dj[i] = L;
152 if(L<djmin) djmin = L;
153 if(L>djmax) djmax = L;
154 while(X--)
155 {
156 scanf("%d %d",&a,&b);
157 t.e = i;
158 t.p = b;
159 G[a].push_back(t);
160 }
161 }
162
163 // 图建立好了
164 ans = INFi;
165 int L = dj[1]-M,R=dj[1];
166 while(L<=dj[1])
167 {
168 //把位于L和R等级之间的保留
169 memset(used,0,sizeof(used));
170 used[N+1] = true;
171 FORi(1,N+1,1)
172 {
173 if( dj[i]>=L && dj[i]<=R)
174 {
175 used[ i ] = true;
176 }
177 }
178
179 //
180 spfa();
181
182 L++;
183 R++;
184 }
185 printf("%d\n",ans);
186 }
187 return 0;
188 }
posted @ 2011-03-03 19:51  AC2012  阅读(388)  评论(0)    收藏  举报