• 挖地雷


    题目描述

          在一个地图上有N个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

    输入

    第一行一个整数n表示有n个地窖 
    第二行有n个整数表示每个地窖的地雷数 
    以下有若干行,每行有两个数x,y表示x可以到y,保证x小于y。 
    最后一行有两个0,表示输入结束 

    输出

    第一行输出挖地雷的顺序。 
    第二行为最多挖出的地雷数 

    样例输入

    6
    5 10 20 5 4 5
    1 2
    1 4
    2 4
    3 4
    4 5
    4 6
    5 6
    0 0

    样例输出

    3-4-5-6
    34

    #include<bits/stdc++.h>

    using namespace std;

    int a[201],ans[201],ji[201];

    bool tu[201][201],zou[201];

    int n,x,y;

    int dfs(int k)

    {

             if(zou[k])

             {

                       return ans[k];

             }

             zou[k]=1;ans[k]=a[k];

             for(int i=1;i<=n;i++)

             {

                       if(tu[k][i]==1)

                       {

                                int jii=dfs(i);

                                if(jii+a[k]>ans[k])

                                {

                                         ans[k]=jii+a[k];

                                         ji[k]=i;

                                }

                       }

             }

             return ans[k];

    }

    int main()

    {

             cin>>n;

             for(int i=1;i<=n;i++)

             {

                       scanf("%d",&a[i]);

             }

             cin>>x>>y;

             while(x!=0&&y!=0)

             {

                       tu[x][y]=1;

                       cin>>x>>y;

             }

             for(int i=1;i<=n;i++)

             {

                       dfs(i);

             }

             int jians=ans[1],jii=1;

             for(int i=2;i<=n;i++)

             {

                       if(ans[i]>jians)

                       {

                                jians=ans[i];

                                jii=i;

                       }

             }

             cout<<jii;

             while(ji[jii])

             {

                       cout<<"-";

                       jii=ji[jii];

                       cout<<jii;

             }

             cout<<endl<<jians;

    }

  • 相关阅读:
    SVN库迁移整理方法----官方推荐方式
    SVN跨版本库迁移目录并保留提交日志
    微信公众号 发送图文消息
    Egret白鹭开发微信小游戏排行榜功能
    双滑动列表实现
    unity之资深工程师
    unity之高级工程师
    lua踩坑系列之浅拷贝与深拷贝
    lua之table.remove你不知道的坑
    unity之Layout Group居中显示
  • 原文地址:https://www.cnblogs.com/fanhao050109/p/11203692.html
Copyright © 2020-2023  润新知