Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
dps加上合理剪枝就可以轻松解决。附上代码,大家借鉴一下。(0ms)#include <stdio.h> struct Node; struct Link { unsigned int v; Node* nn; }; struct Node { unsigned int p; int l; unsigned int n; Link links[100]; }; int dl; unsigned int min; void dps(unsigned int now, Node *root, int minl, int maxl); int main(int argc,char* argv[]) { unsigned int num, tmp, m, n; scanf("%d%d", &dl, &num); Node nodes[100]; for(m=0; m<num; m++) { scanf("%d", &nodes[m].p); scanf("%d", &nodes[m].l); scanf("%d", &nodes[m].n); for(n=0; n<nodes[m].n; n++) { scanf("%d", &tmp); nodes[m].links[n].nn = &nodes[tmp-1]; scanf("%d", &(nodes[m].links[n].v)); } } min = nodes[0].p; dps(0, nodes, nodes[0].l-dl, nodes[0].l+dl); printf("%d\n", min); return 0; } void dps(unsigned int now, Node *root, int minl, int maxl) { int tminl = 0, tmaxl = 0; if(root->p + now < min) min = root->p + now; for(unsigned int n=0; n<root->n; n++) { if( minl <= root->links[n].nn->l && maxl >= root->links[n].nn->l) { if(now + root->links[n].v > min) continue; tminl = root->links[n].nn->l - dl; tmaxl = root->links[n].nn->l + dl; tminl = tminl > minl ? tminl : minl; tmaxl = tmaxl > maxl ? maxl : tmaxl; if(tminl > tmaxl) continue; dps(now + root->links[n].v, root->links[n].nn, tminl, tmaxl); } } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator