【例9.6】挖地雷
阿新 • • 發佈:2017-10-05
存在 int http sin 一點 out string ble space
時間限制: 1000 ms 內存限制: 65536 KB
【例9.6】挖地雷
鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1262
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
在一個地圖上有n個地窖(n<=200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連接路徑,並規定路徑都是單向的,且保證都是小序號地窖指向在序號地窖,也不存在可以從一個地窖出發經過若幹地窖後又回到原來地窖的路徑。某人可以從任一處開始挖地雷,然後沿著指出的連接往下挖(僅能選擇一條路徑),當無連接時挖地雷工作結束。設計一個挖地雷的方案,使他能挖到最多的地雷。
【輸入】
第一行:地窖的個數;
第二行為依次每個地窖地雷的個數;
下面若幹行:
xi yi //表示從xi可到yi,xi<yi。
最後一行為"0 0"表示結束。
【輸出】
k1-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
題解:f[i]表示第i個個坑作為起點最多可得挖多少, a[i]表示第i個地雷的下一點
#include<iostream> #include<cstdio> #include<cstring> using namespacestd; int h[205],f[205],mp[205][205],a[205]; int main() { int n,ans=0,k=0; cin>>n; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++){ cin>>h[i]; f[i]=h[i]; } int x,y; while(cin>>x>>y) {if(!x&&!y)break; mp[x][y]=1; } a[n]=0; for(int i=n-1;i>0;i--) for(int j=i+1;j<=n;j++) if(mp[i][j]&&f[j]+h[i]>f[i]) { f[i]=f[j]+h[i]; a[i]=j; } for(int i=1;i<=n;i++) if(ans<f[i]){ ans=f[i];k=i; } cout<<k; k=a[k]; while(k){ cout<<"-"<<k; k=a[k]; } cout<<endl<<ans<<endl; }
【例9.6】挖地雷