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;
    }
  • 相关阅读:
    ASP.NET图片上传(配合jquery.from.js 插件)
    判断上传文件类型,上传图片
    父子一对多iframe,子iframe改子iframe元素
    Jquery 清空input file的值
    通过createObjectURL实现图片预览
    URL.createObjectURL() 与 URL.revokeObjectURL()
    python try finally和with语句
    python mixin 模式特点
    Python中的Sentinel(哨兵)值
    《JavaScript ES6 函数式编程入门经典》笔记1
  • 原文地址:https://www.cnblogs.com/zsboy/p/2593146.html
Copyright © 2011-2022 走看看