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,,Dota啊?In Reply To:dps加上合理剪枝就可以轻松解决。附上代码,大家借鉴一下。(0ms) Posted by:Leon_Xu at 2010-12-06 10:04:10 > #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