• ZOJ 3620 Escape Time II


    题意:

         从初始房间到达终止房间需要经过一系列的房间,没经过一个房间会得到一个价值,从一个房间到达另一个房间同时需要消耗一定的时间,在规定的时间内从初始到达终止房间          所能达到的最大值是多少

    #include<stdio.h>
    #include<string.h>
    #define INF 99999999
    const int MAXN=15;
    
    int mp[MAXN][MAXN];//储存路径以及时间
    int vis_room[MAXN];//标记房间是否走过
    int vis_edge[MAXN][MAXN];//标记这条路是否走过
    int jewel[MAXN];//每个房间的价值
    int ans1;//储存最大的价值
    int n,m,t;//房间数量,路径数量,规定的时间
    int s,e;//初始房间,终止房间
    //主要思想房间走过无所谓,路径走过不要再走了
    void DFS(int s,int value,int time)
    {
        int flag;
        if(value==INF) return;//房间不可达到
        if(s==e && value>ans1) ans1=value;//到达了终点并且价值大,替换
        for (int i=0;i<n;i++)
        {
            flag=0;
            if(mp[s][i]!=INF && vis_edge[s][i]==0 && time+mp[s][i]<=t)//房间可以到达,并且路径没有走过
            { 
                if(vis_room[i]==0)
                {
                    flag=1;
                    value+=jewel[i];//走过的房间财富不用加
                    vis_room[i]=1;
                }
                vis_edge[s][i]=1;
                DFS(i,value,time+mp[s][i]);//房间走过了财富不用加,时间继续加
                //if(i!=初始房间)//这句话有没有无所谓,只是多搜了几步而已,不过也要注意
                if(flag)//若该房间以前走过了,价值就不需要减
                {
                    value-=jewel[i];  
                    vis_room[i]=0;
                }
                vis_edge[s][i]=0; 
            }
        }
    }
    
    int main()
    {
        int a,b,c;
        int i,j;
        while(scanf("%d%d%d",&n,&m,&t)!=EOF)
        {
            ans1=ans2=0;
            memset(vis_room,0,sizeof(vis_room));
            memset(vis_edge,0,sizeof(vis_edge));
            scanf("%d%d",&s,&e);
            for (i=0;i<n;i++)
                for (j=0;j<n;j++)
                    mp[i][j]=INF;    
                for (i=0;i<n;i++)
                    scanf("%d",&jewel[i]);
                for (i=0;i<m;i++)
                {
                    scanf("%d%d%d",&a,&b,&c);
                    mp[a][b]=c;
                    mp[b][a]=c;
                }
                vis_room[s]=1;
                //这里是wrong的原因,初始房间不一定是0;
                DFS(s,jewel[s],0);//位置,初始房间财宝价值,所用时间
                printf("%d\n",ans1);
        }
        return 0;
    }
  • 相关阅读:
    LINUX
    DOCKER
    计算牛的数目
    计算a^3=b^3+c^3+d^3
    用递归计算C(m,n)
    A Mathematical Curiosity
    Who is lier?
    我的第一篇 实习报告
    R.java
    天气系统
  • 原文地址:https://www.cnblogs.com/zsboy/p/2593146.html
Copyright © 2020-2023  润新知