YCOJ挖地雷
挖地雷
Description
在一個地圖上有N個地窖(N<=200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,也不存在可以從一個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任一處開始挖地雷,然後沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計一個挖地雷的方案,使他能挖到最多的地雷。
Input
第一行一個整數n表示有n個地窖
第二行有n個整數表示每個地窖的地雷數
以下有若干行,每行有兩個數x,y表示x可以到y,保證x小於y。
最後一行有兩個0,表示輸入結束
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 1
3-4-5-6
34
——摘自YCOJ
從題目得知,這是一個有向圖。
也就是說,1可以到2,但2一定不能到1。
嗯~可愛的程式碼:
#include<bits/stdc++.h>
using namespace std;
int b[1000][1000];
int fa[1000],mp[1000],a[1000];
int n,x,y,ans;
int mx,maxn;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>mp[i];
}
do{
cin>>x>>y;
if(x!=0&&y!=0){
b[x][y]=1;
}
}while(x!=0||y!=0);
fa[n]=mp[n];
for(int i=n-1;i>=1;i--){
mx=maxn=0;
for(int j=i+1;j<=n;j++)
if(b[i][j]&&fa[j]>mx)mx=fa[j],maxn=j;
fa[i]=mx+mp[i];
a[i]=maxn;
}
mx=maxn=0;
for(int i=1;i<=n;i++)
if(fa[i]>maxn){
maxn=fa[i],mx=i;
}
ans=maxn;
cout<<mx;
while(a[mx]){
cout<<"-"<<a[mx];
mx=a[mx];
}
cout<<endl;
cout<<ans<<endl;
return 0;
}