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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【每日一题】4月1日题目 Rinne Loves Edges

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【每日一题】4月1日题目 Rinne Loves Edges 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

牛客網
鏈接:https://ac.nowcoder.com/acm/problem/22598
來源:牛客網

  • 題目:
  • 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K
    64bit IO Format:%lld

    題目描述 Rinne 最近了解了如何快速維護可支持插入邊刪除邊的圖,并且高效的回答一下奇妙的詢問。 她現在拿到了一個 n 個節點 m
    條邊的無向連通圖,每條邊有一個邊權 wi 現在她想玩一個游戲:選取一個 “重要點” S,然后選擇性刪除一些邊,使得原圖中所有除 S 之外度為
    1 的點都不能到達 S。 定義刪除一條邊的代價為這條邊的邊權,現在 Rinne 想知道完成這個游戲的最小的代價,這樣她就能輕松到達 rk1
    了!作為回報,她會讓你的排名上升一定的數量。

    輸入描述:

    第一行三個整數 N,M,S,意義如「題目描述」所述。

    接下來 M 行,每行三個整數 u,v,w 代表點 u 到點 v 之間有一條長度為 w 的無向邊。

    輸出描述:

    一個整數表示答案。

    示例1
    輸入

    4 3 1 1 2 1 1 3 1 1 4 1

    輸出

    3

    說明

    需要使得點 2,3,4 不能到達點 1,顯然只能刪除所有的邊,答案為 3

    示例2
    輸入

    4 3 1 1 2 3 2 3 1 3 4 2

    輸出

    1

    說明

    需要使得點 4 不能到達點 1,顯然刪除邊 2?3是最優的。

    備注:

    2≤S≤N≤105,M=N?1保證答案在 C++ long long 范圍內

  • 題解:
  • 仔細觀察題中給的數據m=n-1,其實就是給你一個樹,而被刪除度為1的點就是這個樹的葉子節點,給你的s就是這個樹的根
    那一切就很清楚了:給你一個樹和根節點,讓你通過刪邊使得根節點與葉子節點不相連,問你怎么刪值最小
    這個是樹形dp問題,我們要做的就是在搜索樹的過程中不斷處理數據
    凡是dp問題,都有狀態轉移,就是一個大問題可以小問題
    s為根節點時,要刪去一些邊讓s與每個葉子節點不連通,其實就是讓x為根節點的子樹刪去一些邊,使得s和x的子樹上每個葉子節點不連通。
    兩種情況:一個就是刪去x與他兒子y的邊
    另一個就是看以y為子樹的根節點的最小情況。
    我們取較小值
    f[x]+=min(f[y],edge[i].w);
    edge[i].w是指當前節點x與其子節點y的距離
    具體看代碼吧

  • 代碼:
  • #include<bits/stdc++.h> using namespace std; const int maxn=1e5+3; int f[maxn]; struct node{int u,v,w,next; }edge[maxn*2]; int root[maxn]; int head[maxn]; int cnt=0;int n,m,s; void addt(int u,int v,int w) {edge[++cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt; } void dfs(int x,int fa) {if(x!=s&&root[x]==1)f[x]=-1;//如果這個是葉子節點,就斷絕與父親的關系 //根節點s也有可能度為1,所以要除s之外int now;//當前點x的子節點//關系(fa-->x-->now)for(int i=head[x];i;i=edge[i].next){now=edge[i].v;if(now==fa)continue;//因為是無向圖,我們要防止返回到父親節點dfs(now,x);//繼續向下if(f[now]==-1)f[x]+=edge[i].w;//這個我們已經給斷絕關系了,只加當前邊的權值else f[x]+=min(f[now],edge[i].w);//考慮兩個方面} } int main() {cin>>n>>m>>s;int u,v,w;for(int i=1;i<=m;i++){cin>>u>>v>>w;addt(u,v,w);addt(v,u,w);//鏈式前向星root[u]++;root[v]++;} dfs(s,0);printf("%d",f[s]);return 0; }

    總結

    以上是生活随笔為你收集整理的【每日一题】4月1日题目 Rinne Loves Edges的全部內容,希望文章能夠幫你解決所遇到的問題。

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