題目鏈接:?
HDU 4118 Holiday's Accommodation
分析: 可以知道每條邊要走的次數(shù)剛好的是這條邊兩端的點(diǎn)數(shù)的最小值的兩倍。
代碼:
?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=100000+10;
struct node{
int to, dix, next;
}tree[maxn<<1];
int head[maxn],g[maxn],ptr;
bool vis[maxn];
void Init(){
ptr=1;
memset(vis,false,sizeof(vis));
memset(head,-1,sizeof(head));
}
void AddEdge(int a,int b,int c){
tree[ptr].to=b;
tree[ptr].dix=c;
tree[ptr].next=head[a];
head[a]=ptr++;
}
void DFS(){
vis[1]=true;
stack<int>M;
M.push(1);
int rt=head[1];
while(true){
if(rt==-1){
int a=M.top(); M.pop();
if(M.empty()) break;
g[M.top()]+=g[a];
}
rt=head[M.top()];
while(rt!=-1){
if(!vis[tree[rt].to]){
vis[tree[rt].to]=true;
M.push(tree[rt].to);
break;
}
rt=tree[rt].next;
}
}
}
int main(){
int T,cas=1;
scanf("%d",&T);
while(T--){
Init();
int n; scanf("%d",&n);
for(int i=1;i<n;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
AddEdge(a,b,c);
AddEdge(b,a,c);
g[i]=1;
}
g[n]=1;
DFS();
__int64 ans=0;
for(int i=1;i<ptr;i+=2){
int m=min(g[tree[i].to],g[tree[i+1].to]);
ans+=2*min(n-m,m)*(__int64)tree[i].dix;
}
printf("Case #%d: %I64d\n",cas++,ans);
}
return 0;
}
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

