一本通1262 挖地雷

【题目描述】

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

【输入】

第一行:地窖的个数;

第二行:为依次每个地窖地雷的个数;

下面若干行:

xi  yi   //表示从xi可到yixi<yi。

最后一行为"0"表示结束。

【输出】

k1k2kv //挖地雷的顺序

挖到最多的雷。

【输入样例】

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<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 201
#define MOD 2520
#define E 1e-12
using namespace std;
int g[N][N];
int w[N],pre[N];
int f[N];
void print(int k)
{
if(k==0)//打印函数,如果已经打印了第一个,也就是没有数了,那么直接返回
return;

print(pre[k]);//如果前面还有数那么就直接打印那一个数

if(pre[k]==0)//如果前面没有数了(这是最后一个数),那么不再打印“-”
cout<<k;
else
cout<<"-"<<k;//如果不是最后一个数,那么要打印“-”
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
f[i]=w[i];
}

int x,y;
while(scanf("%d%d",&x,&y)!=EOF&&x&&y)
g[x][y]=1;//意为从x到y的路是通的

int maxx=-INF,k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if( g[j][i]==1 && f[j]+w[i]>f[i] )//如果是通路并且挖的地雷更多,那么更新数据
{
f[i]=f[j]+w[i];
pre[i]=j;//记录这个数前面的选择,以便于输出
}
}
if(f[i]>maxx)
{
maxx=f[i];
k=i;//记录最后一个数的位置
}
}
print(k);
cout<<endl<<maxx<<endl;
return 0;

很显然,里边有一些比较花里胡哨的东西是我不会的,所以这个代码是我剽窃的别人的智慧,但是我已经懂了,这也是收获

原文地址:https://www.cnblogs.com/57xmz/p/12489953.html