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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UVA - 10859 Placing Lampposts 放置街灯

發(fā)布時(shí)間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA - 10859 Placing Lampposts 放置街灯 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Placing Lampposts

傳送門(mén):https://vjudge.net/problem/UVA-10859

題目大意:給你一片森林,要求你在一些節(jié)點(diǎn)上放上燈,一個(gè)點(diǎn)放燈能照亮與之相連的所有的邊。問(wèn)你最小化防止的燈數(shù),在燈數(shù)相同的條件下,最大化兩個(gè)點(diǎn)都有燈的邊數(shù)。
題解:

  首先有一個(gè)套路,也是做了此題才知道的,很神奇啊。最小化燈的數(shù)量,我們?cè)O(shè)燈數(shù)為V1,把“最大化兩個(gè)點(diǎn)都有燈的邊數(shù)”轉(zhuǎn)化為“最下化只有一個(gè)點(diǎn)有燈的邊數(shù)”,設(shè)為V2,那么我們?cè)O(shè)Val=Eps*V1+V2。這樣只要DP一個(gè)值就可以了。Eps設(shè)成一個(gè)足夠大的值,保證Eps>sum{V2}。此題姑且設(shè)為2000。
  然后我們就可以DP了。樹(shù)上求解最優(yōu)解,此題為森林,轉(zhuǎn)化為每棵樹(shù)的答案相加就可以了。那么怎么DP呢?
  設(shè)狀態(tài)DP[i]代表i節(jié)點(diǎn)與它的子樹(shù)以及連向父親的那一條邊的最小的Val。每一個(gè)節(jié)點(diǎn)有放燈與不放燈兩種狀態(tài),但是我們發(fā)現(xiàn),父親放不放燈會(huì)影響兒子放不放燈,那么我們?cè)偌由弦痪S的狀態(tài):dp[i][0/1]代表代表i節(jié)點(diǎn)與它的子樹(shù)以及連向父親的那一條邊的最小的Val,j=1為父親放燈,j=0代表父親不放燈。
考慮兩種方案:
1.  i放燈:i放燈的話(huà),對(duì)于其他的沒(méi)有什么要求,所以dp[i][j]+=dp[son][1],dp[i][j]+=Eps。如果當(dāng)前j==0,并且不是根節(jié)點(diǎn),那么dp[i][j]++,因?yàn)榈礁赣H的那一條邊只有1個(gè)燈。
2.  i不放燈:i不放燈,轉(zhuǎn)移就有限制條件了,必須父親放燈,或者i為根節(jié)點(diǎn),dp[i][1]+=dp[son][0],如果i不是根節(jié)點(diǎn),那么還要++,同樣的因?yàn)榈礁赣H的那一條邊只有1個(gè)燈。
  然后一邊dfs一邊DP就可以了。注意狀態(tài)轉(zhuǎn)移是錯(cuò)綜復(fù)雜的,并不是單一的0->1或0->0,具體順序見(jiàn)代碼。
  條件1可以更新j=1和0的情況;條件2只能更新j=1的情況,但是在根節(jié)點(diǎn)也可以更新j=0的情況。

1 #include<queue> 2 #include<cstdio> 3 #include<vector> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #define RG register 8 #define LL long long 9 #define fre(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout); 10 using namespace std; 11 const int MAXN=5000,Eps=2000; 12 int n,num,m,Case,ans; 13 int dp[MAXN][2]; 14 int head[MAXN],to[MAXN],Next[MAXN]; 15 bool vis[MAXN]; 16 void dfs(int u,int fa) 17 { 18 vis[u]=1; 19 int sum1=0,sum2=Eps; 20 for(int i=head[u];i;i=Next[i]) 21 { 22 int v=to[i]; 23 if(v==fa)continue; 24 dfs(v,u); 25 sum1+=dp[v][0];//不放燈 26 sum2+=dp[v][1];//放燈 27 } 28 if(fa!=0)sum1++; 29 dp[u][1]=sum1; 30 dp[u][1]=min(dp[u][1],sum2);//與放燈的再比較一下。 31 dp[u][0]=sum2; 32 if(fa!=0) dp[u][0]++; 33 if(fa==0) 34 dp[u][0]=min(dp[u][0],sum1); 35 } 36 void add(int f,int t) 37 { 38 Next[++num]=head[f]; 39 to[num]=t; 40 head[f]=num; 41 } 42 int main() 43 { 44 scanf("%d",&Case); 45 while(Case--) 46 { 47 scanf("%d%d",&n,&m); 48 num=0; 49 memset(head,0,sizeof head); 50 memset(vis,0,sizeof vis); 51 memset(dp,0,sizeof dp); 52 for(int i=1,a,b;i<=m;i++) 53 { 54 scanf("%d%d",&a,&b); 55 a++,b++; 56 add(a,b); add(b,a); 57 } 58 ans=0; 59 for(int i=1;i<=n;i++) 60 if(!vis[i]) 61 { 62 dfs(i,0); 63 ans+=min(dp[i][0],dp[i][1]); 64 } 65 printf("%d %d %d\n",ans/Eps,m-ans%Eps,ans%Eps); 66 } 67 return 0; 68 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/D-O-Time/p/7663692.html

總結(jié)

以上是生活随笔為你收集整理的UVA - 10859 Placing Lampposts 放置街灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。