挖地雷(类似数塔)

挖地雷

时间限制: 1 Sec  内存限制: 128 MB
提交: 9  解决: 8
[提交][状态][讨论版][命题人:外部导入]

题目描述

      在一个地图上有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<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
int a[205];
int dp[205];
int f[205];
vector<int>v[205];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        f[i]=i;
        dp[i]=a[i];
        while(v[i].size()>0) v[i].pop_back();
    }
    int x,y;
    while(cin>>x>>y)
    {
        if(x==0&&y==0) break;
        v[x].push_back(y);//x能到达的所有点记录
    }
    for(int i=n-1;i>=1;i--)//倒着遍历,类似数塔
    {
        for(int j=0;j<v[i].size();j++)
        {
            if(a[i]+dp[v[i][j]]>dp[i])
            {
                dp[i]=a[i]+dp[v[i][j]];
                f[i]=v[i][j];//通过f来记录路径
            }
        }
    }
    int mx=0;
    int k=-1;
    for(int i=1;i<=n;i++)//输出路径
    {
        if(dp[i]>mx)
        {
            mx=dp[i];
            k=i;
        }
    }
    cout<<k;
    while(f[k]!=k)
    {
        k=f[k];
        cout<<"-"<<k;
    }
    cout<<endl;
    cout<<mx<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/caiyishuai/p/9008768.html