和MM逛南邮

  • Description

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

  • Input

多组测试数据,每组数据第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

#include<iostream>
using namespace std;
const int MAX=22;
bool visit[MAX][MAX];
int N,M,T1,T2;
int Happy;
struct Mapp
{
    int T,H;
}MAP[MAX][MAX];
void dfs(int p,int t,int h)
{
    if(p==0 && t>=T1 && t<=T2 && h>Happy)
    {
        Happy=h;
    }
    int i;
    for(i=0;i<N;i++)
    {
        if(visit[i][p] && MAP[i][p].T+t<=T2)
        {
            visit[i][p]=visit[p][i]=false;
            dfs(i,t+MAP[p][i].T,h+MAP[p][i].H);
            visit[i][p]=visit[p][i]=true;
        }
    }
    return ;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int x,y,t,h,i,j;
    while(scanf("%d %d %d %d",&N,&M,&T1,&T2)!=EOF)
    {
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
                visit[i][j]=false;
        for(i=0;i<M;i++)
        {
            scanf("%d %d %d %d",&x,&y,&t,&h);
            MAP[x][y].T=MAP[y][x].T=t;
            MAP[x][y].H=MAP[y][x].H=h;
            visit[x][y]=visit[y][x]=true;
        }
        Happy=-1;
        dfs(0,0,0);
        printf("%d\n",Happy);
    }
    return 0;
}

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