poj1062昂贵的聘礼(DFS)
http://poj.org/problem?id=1062
poj计划里最短路题 用DFS做的。。
弄了一下午 终于搜过了 注意 全局的最大跟最小值的差不能超过它所规定的限制
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 int m,mi,xf[111],flag,minn,maxx; 6 struct node 7 { 8 int p,l,x; 9 int t[101],v[101]; 10 }q[101]; 11 void dfs(int d,int tm) 12 { 13 int i,j,f = 0 ; 14 for(i = 1; i <= q[d].x ; i++) 15 { 16 if(q[d].v[i]<q[d].p&&q[d].l-q[q[d].t[i]].l<=m&&!xf[q[d].t[i]]) 17 { 18 int tmax = maxx; 19 int tmin = minn; 20 if(q[q[d].t[i]].l>maxx) 21 maxx = q[q[d].t[i]].l; 22 if(q[q[d].t[i]].l<minn) 23 minn = q[q[d].t[i]].l; 24 if(maxx-minn>m) 25 { 26 maxx = tmax; 27 minn = tmin; 28 continue ; 29 } 30 xf[q[d].t[i]] = 1; 31 tm += q[d].v[i]; 32 dfs(q[d].t[i],tm); 33 xf[q[d].t[i]] = 0; 34 tm-=q[d].v[i]; 35 maxx = tmax; 36 minn = tmin; 37 f = 1; 38 } 39 } 40 if(!f) 41 { 42 tm+=q[d].p; 43 if(mi>tm) 44 mi = tm; 45 tm-=q[d].p; 46 return ; 47 } 48 } 49 int main() 50 { 51 int i,j,k,n; 52 scanf("%d%d",&m,&n); 53 for(i = 1; i <= n ;i++) 54 { 55 scanf("%d%d%d",&q[i].p,&q[i].l,&q[i].x); 56 for(j = 1; j <= q[i].x ; j++) 57 scanf("%d %d",&q[i].t[j],&q[i].v[j]); 58 } 59 mi = q[1].p; 60 minn = q[1].l; 61 maxx = q[1].l; 62 xf[1] = 1; 63 dfs(1,0); 64 printf("%d\n",mi); 65 return 0; 66 }