您的位置:首页 > 其它

挖地雷

2013-11-11 11:08 169 查看

挖地雷

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

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

Input

输入有多组数据,每组数据的第一行为一个整数n,表示地窖的个数,第二行为n个地窖中的地雷数。下面多行数据以0,0结束,每行为两个数x和y,表示从x可以到y。

Output

对于每组数据输出两行,第一行为挖地雷的顺序,第二行为最多挖出的地雷数

Sample Input

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


Sample Output

3-4-5-6
34


#include <iostream>

#include <string.h>

#include <stack>

#include <stdio.h>

using namespace std;

int main ()

{ int a[220];//储存地雷个数

int b[220];// 储存路径

int d[220][220]; //存储可以相通的路径

int t,n;

stack <int > s;

int i,j,x,y;

int cmax,h;

int max1,flag;

cin>>t;

while(t--)

{ memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

memset(d,0,sizeof(d));

cin>>n;

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

cin>>a[i];

do

{

cin>>x>>y;

d[x][y]=1;

}

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

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

{

cmax=a[i];

for(j=1;j<i;j++)

if(d[j][i]==1&&a[i]<a[j]+cmax) //例如i=3 j 从1到3 就搜索1是否可以到达2 3;

{

a[i]=a[j]+cmax;

b[i]=j;

}

}

max1=0;

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

{

if(a[i]>max1)

{

max1=a[i];

flag=i;

}

}

do

{

s.push(flag);

flag=b[flag];

}while(flag);

// h=s.top();

cout<<s.top();

s.pop();

while(!s.empty())

{

cout<<'-'<<s.top();

s.pop();

}

cout<<endl;

cout<<max1<<endl;

}

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: