TYVJ 1248 丛林探险 解题报告

  就用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;
}
posted @ 2011-08-01 14:16  zqynux  阅读(211)  评论(0编辑  收藏  举报