| ||||||||||
| 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