挖地雷

Problem Description

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

Input

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

Output

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

Sample Input

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
【代码】
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxx=1001;
 5 int w[maxx],a[maxx][maxx],f[maxx],c[maxx];//w为每个地窖的地雷数目,a为地窖与地窖之间是否连通,f记录从每个地窖开始挖最多能挖多少,c为记录路径 
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++)
11     scanf("%d",&w[i]);
12     int x,y;
13     do
14     {
15      scanf("%d%d",&x,&y);
16      if(x!=0&&y!=0)
17      a[x][y]=1;    
18     }while(x!=0&&y!=0);
19     f[n]=w[n];//最后一个地窖开始能挖的就只有他自己的了,因为没有和它连着的地窖 
20     for(int i=n-1;i>=1;i--)//从后往前 
21     {
22         int l=0,k=0;
23         for(int j=i+1;j<=n;j++)
24         {
25             if(a[i][j]&&f[j]>l)//这两个地窖相连并且要选一条能挖地雷最多的道路 
26             {
27                 l=f[j];//找最大 
28                 k=j;//记录答案 
29             }
30         }
31         f[i]=w[i]+l;//从i从发能挖的地雷 
32         c[i]=k;//记录前驱 
33     }
34     int k=1;
35     for(int i=1;i<=n;i++)
36     {
37         if(f[i]>f[k])//寻找能挖地雷最多的 
38         k=i;
39     }
40     cout<<f[k]<<endl;//输出挖的地雷 
41     cout<<k;//输出道路 
42     k=c[k];
43     while(k!=0)
44     {
45         cout<<"-"<<k;
46         k=c[k];
47     }
48     cout<<endl;
49     return 0;
50 }
View Code

 

posted @ 2017-04-05 17:56  ANhour  阅读(851)  评论(0编辑  收藏  举报