1. 程式人生 > >1262:【例9.6】挖地雷

1262:【例9.6】挖地雷

題目描述】

在一個地圖上有n個地窖(n≤200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,且保證都是小序號地窖指向在序號地窖,也不存在可以從一個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任一處開始挖地雷,然後沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計一個挖地雷的方案,使他能挖到最多的地雷。

【輸入】

第一行:地窖的個數;

第二行為依次每個地窖地雷的個數;

下面若干行:

xi yixi yi   //表示從xixi可到yiyi,xi<yixi<yi。

最後一行為"0 0"表示結束。

 

【輸出】

k1−k2−…−kvk1−k2−…−kv    //挖地雷的順序

挖到最多的雷。

 

【輸入樣例】

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

【來源】


No

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
#define maxn 305
#define inf 0x3f3f3f3f
using namespace std;
int n,a[maxn][maxn],w[maxn];
int f[maxn];
int pre[maxn];
int main()
{
    memset(pre,0,sizeof(pre));
//memset(f,0,sizeof(f));
    memset(a,0,sizeof(a));
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i];
        for(int i=1;i<=n;i++)
            f[i]=w[i];
        int x,y;
        while(cin>>x>>y)
        {if(x==0&&y==0)
        break;
            a[x][y]=1;
        }
   pre[n]=0;
    for(int i=n-1;i>=1;i--)
    for(int j=i+1;j<=n;j++)
    if(a[i][j]>0&&f[i]<f[j]+w[i])
    {f[i]=f[j]+w[i];
    pre[i]=j;

}
int maxl=-10000;
int k=1;
for(int i=1;i<=n;i++)
    if(f[i]>maxl)
       {
           maxl=f[i];
           k=i;
       }

       cout<<k;
       k=pre[k];
    while(k!=0)
    {
        cout<<"-"<<k;
        k=pre[k];
    }
    cout<<endl;
    cout<<maxl<<endl;
    return 0;
}