比赛描述
Openxxx生日那天,他要带着他的MM逛一逛南邮的校园。南邮校园可以看成是一个无向图,Openxxx和他的MM将从学校门口出发,走过一些道路,最终回到学校门口。Openxxx不会带着MM两次经过同一条道路,因此每条道路最多被走过一次。每条道路都有两种属性T和H,分别表示走过这条道路所需的时间以及沿途的风景能够给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); } }