zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    My97DatePicker控件显示时分秒
    【servlet学习1】使用eclipse+tomcat开发servlet示例
    JNI之JAVA调用C++接口
    关闭页面,window.onunload事件未执行的原因
    java finally块执行时机分析
    c# IL 指令集
    java 字节码指令集
    Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
    常用的Linux可插拔认证模块(PAM)应用举例(一)
    开始我的博客旅途
  • 原文地址:https://www.cnblogs.com/zsboy/p/2593146.html
Copyright © 2011-2022 走看看