南邮 OJ 1510 和MM逛南邮

来源:互联网 发布:电力工程结算软件 编辑:程序博客网 时间:2024/06/18 09:02

和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 10int 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 10int 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 10int 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]);//WA1t[0][i] = t[i][0] = temp;}}printf("%d\n",maxH);}}






0 0