南邮 OJ 1510 和MM逛南邮

和MM逛南邮

时间限制(普通/Java) :  2000 MS/ 6000 MS          运行内存限制 : 65536 KByte
总提交 : 123            测试通过 : 39 

比赛描述

Openxxx生日那天,他要带着他的MM逛一逛南邮的校园。南邮校园可以看成是一个无向图,Openxxx和他的MM将从学校门口出发,走过一些道路,最终回到学校门口。Openxxx不会带着MM两次经过同一条道路,因此每条道路最多被走过一次。每条道路都有两种属性TH,分别表示走过这条道路所需的时间以及沿途的风景能够给Openxxx和他的MM带去的幸福指数。Openxxx希望逛校园的时间能够尽可能的长,但逛得太久MM会感觉疲惫,所以逛校园的时间应当不小于T1且不大于T2。同时,Openxxx希望和他的MM能够获得尽可能多的幸福指数。听说你是个很有天赋的编程能手,希望你帮助Openxxx找到一条最优的逛校园路线。



输入

多组测试数据,每组数据第1行输入四个正整数N,M,T1,T2,N表示图中的顶点个数(用0,1,……,N-1作为各个顶点的编号,其中0号顶点代表学校门口),M表示图中的边数,T1,T2分别代表逛校园时间的下限和上限。第2行到M+1行每行输入四个非负整数X,Y,T,H,表示顶点X到顶点Y有一条需要T时间通过,且幸福指数为H的道路。输入数据保证不会有重边和自环。( 3≤N≤10, N≤M≤20, 1≤T1≤10000, T1≤T2≤10000, 0≤X,Y<N,0≤T,H≤10000 ) 输入直至文件结尾。

输出

每组数据输出一行一个整数,最优路线的幸福指数MaxH;如果没有满足要求的路线,则输出 “-1”(不包含双引号)。

样例输入

3 3 1 10000
0 1 100 100
1 2 100 100
0 2 100 100
4 4 1 10000
0 1 100 100
1 2 100 100
2 3 100 100
1 3 100 100

样例输出

300
-1

提示

 

题目来源

openxxx



/* Wrong Answer at Test 1
#include<iostream>
#define MAX_N 10

int t[MAX_N][MAX_N];
int h[MAX_N][MAX_N];
int N,M,T1,T2,maxH;

void dfs(int i,int ct,int ch){
	if(ct > T2){
		return;
	}
	if(i==0 && ct>=T1 && ch>maxH){
		maxH = ch;
	}
	int j,temp;
	for(j=0;j<N;j++){
		if(t[i][j]){
			temp = t[i][j];
			t[i][j] = t[j][i] = 0;
			dfs(j,ct+temp,ch+h[i][j]);
			t[i][j] = t[j][i] = temp;
		}
	}
}

int main(){
//	freopen("test.txt","r",stdin);
	int i,j,T,H;
	while(scanf("%d%d%d%d",&N,&M,&T1,&T2)==4){
		memset(t,0,sizeof(t));
		memset(h,0,sizeof(h));
		maxH = -1;
		while(M--){
			scanf("%d%d%d%d",&i,&j,&T,&H);
			t[i][j] = t[j][i] = T;
			h[i][j] = h[j][i] = H;
		}
		for(i=1;i<N;i++){
			if(t[0][i]){
				int temp = t[0][i];
				t[0][i] = t[i][0] = 0;
				dfs(i,0,h[0][i]);
				t[0][i] = t[i][0] = temp;
			}
		}
		printf("%d\n",maxH);
	}
}
*/

/* Wrong Answer at Test 1
#include<iostream>
#define MAX_N 10

int t[MAX_N][MAX_N];
int h[MAX_N][MAX_N];
int N,M,T1,T2,maxH;

void dfs(int i,int ct,int ch){
	if(ct > T2){
		return;
	}
	if(i==0){			//到出口后,就不回去了
		if(ct>=T1 && ch>maxH){
			maxH = ch;
		}
		return;
	}
	int j,temp;
	for(j=0;j<N;j++){
		if(t[i][j]){
			temp = t[i][j];
			t[i][j] = t[j][i] = 0;
			dfs(j,ct+temp,ch+h[i][j]);
			t[i][j] = t[j][i] = temp;
		}
	}
}

int main(){
//	freopen("test.txt","r",stdin);
	int i,j,T,H;
	while(scanf("%d%d%d%d",&N,&M,&T1,&T2)==4){
		memset(t,0,sizeof(t));
		memset(h,0,sizeof(h));
		maxH = -1;
		while(M--){
			scanf("%d%d%d%d",&i,&j,&T,&H);
			t[i][j] = t[j][i] = T;
			h[i][j] = h[j][i] = H;
		}
		for(i=1;i<N;i++){
			if(t[0][i]){
				int temp = t[0][i];
				t[0][i] = t[i][0] = 0;
				dfs(i,0,h[0][i]);
				t[0][i] = t[i][0] = temp;
			}
		}
		printf("%d\n",maxH);
	}
}
*/


#include<iostream>
#define MAX_N 10

int t[MAX_N][MAX_N];
int h[MAX_N][MAX_N];
int N,M,T1,T2,maxH;

void dfs(int i,int ct,int ch){
	if(ct > T2){
		return;
	}
	if(i==0 && ct>=T1 && ch>maxH){
		maxH = ch;
	}
	int j,temp;
	for(j=0;j<N;j++){
		if(t[i][j] != -1){
			temp = t[i][j];
			t[i][j] = t[j][i] = -1;
			dfs(j,ct+temp,ch+h[i][j]);
			t[i][j] = t[j][i] = temp;
		}
	}
}

int main(){
//	freopen("test.txt","r",stdin);
	int i,j,T,H;
	while(scanf("%d%d%d%d",&N,&M,&T1,&T2)==4){
		memset(t,-1,sizeof(t));
		memset(h,0,sizeof(h));
		maxH = -1;
		while(M--){
			scanf("%d%d%d%d",&i,&j,&T,&H);
			t[i][j] = t[j][i] = T;
			h[i][j] = h[j][i] = H;
		}
		for(i=1;i<N;i++){
			if(t[0][i]!=-1){				//-1标志此路不通
				int temp = t[0][i];
				t[0][i] = t[i][0] = -1;
				dfs(i,temp,h[0][i]);		//WA1
				t[0][i] = t[i][0] = temp;
			}
		}
		printf("%d\n",maxH);
	}
}






你可能感兴趣的:(ACM,南邮OJ,和MM逛南邮)