日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HNOI2009]无归岛

發布時間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HNOI2009]无归岛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description


Neverland是個神奇的地方,它由一些島嶼環形排列組成,每個島上都生活著之中與眾不同的物種。但是這些物種都有一個共同的生活習性:對于同一個島上的任意兩個生物,他們有且僅有一個公共朋友,即對同一島上的任意兩個生物a和b有且僅有一個生物c既是a的朋友也是b的朋友,當然某些島上也可能會只有一個生物孤單地生活著。這一習性有一個明顯的好處,當兩個生物發生矛盾的時候,他們可以請那個唯一的公共朋友來裁決誰對誰錯。

另外,島與島之間也有交流,具體來說,每個島都會挑選出一個最聰明的生物做代表,然后這個生物與他相鄰的兩個島的代表成為朋友。

不行的是,A世界準備入侵Neverland,作為Neverland的守護者,Lostmonkey想知道在一種比較壞的情況下Never的戰斗力。因為和朋友并肩作戰,能力會得到提升,所以Lostmonkey想知道在不選出一對朋友的情況下Neverland的最大戰斗力。即選出一些生物,且沒有一對生物是朋友,并且要求它們的戰斗力之和最大。

Input

第一行包含用空格隔開的兩個整數n和m,分別表示Neverland的生物種數和朋友對數。接下來的m行描述所有朋友對,具體來說,每行包含用空格隔開的兩個整數a和b,表示生物a和生物b是朋友(每對朋友只出現一次)。第m+2行包含用空格隔開的n個整數,其中第i個整數表示生物i的戰斗力Ai。輸入數據保證4<=n<=100000,1<=a,b<=n,1<=m<=200000,-1000<=Ai<=1000.

Output

?

僅包含一個整數,表示滿足條件的最大戰斗力。

Sample Input



6 7
1 2
2 3
3 4
4 1
3 6
3 5
5 6
20 10 30 15 20 10

Sample Output


50

【樣例說明】

有四個島,生物1在1號島,生物2在2號島,生物3、5、6在3號島,生物4在4號島。

題解都說原圖是仙人掌,但我不知道怎麼證,有人知道可以告訴我

如果是仙人掌,那么就可以環DP,可以保證復雜度不會退化

f[i][0]表示這個點選擇了的最大值,f[i][1]表示未選

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct Node 7 { 8 int next,to; 9 }edge[400001]; 10 int head[100001],num,f[100001][2],n,m,fa[100001],cnt,dfn[100001],low[100001],val[100001]; 11 void add(int u,int v) 12 { 13 num++; 14 edge[num].next=head[u]; 15 edge[num].to=v; 16 head[u]=num; 17 } 18 void dp(int root,int x) 19 {int i; 20 int u1=0,u2=0,v1,v2; 21 for (i=x;i!=root;i=fa[i]) 22 { 23 v1=u1+f[i][0];v2=u2+f[i][1]; 24 u1=v2;u2=max(v1,v2); 25 } 26 f[root][1]+=u2; 27 u1=-2e9,u2=0; 28 for (i=x;i!=root;i=fa[i]) 29 { 30 v1=u1+f[i][0];v2=u2+f[i][1]; 31 u1=v2;u2=max(v1,v2); 32 } 33 f[root][0]+=u1; 34 } 35 void dfs(int x) 36 {int i; 37 ++cnt; 38 low[x]=dfn[x]=cnt; 39 for (i=head[x];i;i=edge[i].next) 40 { 41 int v=edge[i].to; 42 if (v!=fa[x]) 43 if (!dfn[v]) 44 { 45 fa[v]=x; 46 dfs(v); 47 low[x]=min(low[x],low[v]); 48 } 49 else low[x]=min(low[x],dfn[v]); 50 } 51 f[x][0]=val[x]; 52 for (i=head[x];i;i=edge[i].next) 53 { 54 int v=edge[i].to; 55 if (fa[v]!=x&&dfn[v]>dfn[x]) 56 dp(x,v); 57 } 58 } 59 int main() 60 {int i,u,v; 61 cin>>n>>m; 62 for (i=1;i<=m;i++) 63 { 64 scanf("%d%d",&u,&v); 65 add(u,v);add(v,u); 66 } 67 for (i=1;i<=n;i++) 68 scanf("%d",&val[i]); 69 dfs(1); 70 cout<<max(f[1][0],f[1][1]); 71 }

?

轉載于:https://www.cnblogs.com/Y-E-T-I/p/8127092.html

總結

以上是生活随笔為你收集整理的[HNOI2009]无归岛的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。