COGS 613 火车站饭店
生活随笔
收集整理的這篇文章主要介紹了
COGS 613 火车站饭店
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
613. 火車站飯店
★☆?? 輸入文件: profitz.in?? 輸出文件: profitz.out??? 簡單對比時間限制:1 s?? 內存限制:128 MB
【題目描述】
政府邀請了你在火車站開飯店,但不允許同時在兩個相連的火車站開。任意兩個火車站有且只有一條路徑,每個火車站最多有 50 個和它相連接的火車站。
告訴你每個火車站的利潤,問你可以獲得的最大利潤為多少?
例如下圖是火車站網絡:
最佳投資方案是 1 , 2 , 5 , 6 這 4 個火車站開飯店可以獲得的利潤為 90.
【輸入格式】
第一行輸入整數 N(<=100000), 表示有 N 個火車站,分別用 1,2,……..,N 來編號。接下來 N 行,每行一個整數表示每個站點的利潤,接下來 N-1 行描述火車站網絡,每行兩個整數,表示相連接的兩個站點。
【輸出格式】
輸出一個整數表示可以獲得的最大利潤。
【樣例輸入】
6?
10?
20?
25?
40?
30?
30?
4 5?
4 6?
3 4?
1 3?
2 3
【樣例輸出】
90
樹形DP 此題不需要轉化成二叉樹(其實我也不會......)
由兒子的最大值推得父親的最大值
原來寫過一個類似的 ?上司的舞會
而且這次也寫saca了
存反向邊一開始s數組開的不夠 導致RE7組
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<cstdlib> #include<ctime> using namespace std; const int lim=100011; int m,root,z; int d[lim]; struct self{int x,y;}s[lim*2]; int first[lim*2],nxt[lim*2];vector<int>g[lim]; int a,b,c; int f[lim][2]; bool flag[lim];void maketree(int i) {flag[i]=1;for(int e=first[i];e!=-1;e=nxt[e])if(!flag[s[e].y]){g[i].push_back(s[e].y);maketree(s[e].y);} }int work(int i,int chosen) {if(f[i][chosen]!=-1)return f[i][chosen];if(chosen==0){f[i][chosen]=0;for(int k=0;k<g[i].size();k++)f[i][chosen]+=max(work(g[i][k],0),work(g[i][k],1));return f[i][chosen];}f[i][chosen]=d[i];for(int k=0;k<g[i].size();k++)f[i][chosen]+=work(g[i][k],0);return f[i][chosen]; }int main() {srand(time(NULL));freopen("profitz.in","r",stdin);freopen("profitz.out","w",stdout);memset(first,-1,sizeof(first));memset(nxt,-1,sizeof(nxt));memset(f,-1,sizeof(f));scanf("%d",&m);for(a=1;a<=m;a++)scanf("%d",&d[a]);for(a=1;a<m;a++){scanf("%d%d",&s[a].x,&s[a].y);s[a+m].x=s[a].y;s[a+m].y=s[a].x;nxt[a]=first[s[a].x];first[s[a].x]=a;nxt[a+m]=first[s[a].y];first[s[a].y]=a+m;}root=rand()%m+1;maketree(root);z=max(work(root,0),work(root,1));cout<<z<<'\n';return 0; }總結
以上是生活随笔為你收集整理的COGS 613 火车站饭店的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware 安装失败解决方案,亲测有效
- 下一篇: 优动漫PAINT是什么?有哪些功能和特色