您的位置:首页 > 其它

TYVJ 1248 丛林探险 解题报告

2011-08-01 14:16 267 查看
  就用DFS吧,然后注意剪枝和环就行,代码如下:

#include <stdio.h>
#include <stdlib.h>
int rode[80000], next[80000];
int time[80000], tili[80000];
int tail;
int head[5000];
int n, m;
int have, ans = 0xFFFFFFF;
int use, tmp;
int t;

void add(int a, int b, int c, int d)
{
tili[tail] = c;
time[tail] = d;
rode[tail] = b;
next[tail] = head[a];
head[a] = tail;
tail++;
}

int used[5000];

void srch(int s)
{
int i;
if(s == t){
ans = tmp;
return;
}
for(i = head[s]; i != -1; i = next[i]){
tmp += time[i];
use += tili[i];
if(use <= have && tmp < ans && !used[rode[i]]){
used[rode[i]] = 1;
srch(rode[i]);
used[rode[i]] = 0;
}
tmp -= time[i];
use -= tili[i];
}
}

int main(int argc, char **argv)
{
int i;
int a, b, c, d;
int s;
scanf("%d%d", &n, &m);
for(i = 0; i < n; i++){
head[i] = -1;
}
for(i = 0; i < m; i++){
scanf("%d%d%d%d", &a, &b, &c, &d);
a--, b--;
add(a, b, c, d);
add(b, a, c, d);
}
scanf("%d%d%d", &s, &t, &have);
s--, t--;
used[s] = 1;
srch(s);
if(ans == 0xFFFFFFF){
printf("-1\n");
}else{
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: