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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu3367 Pseudoforest

發(fā)布時間:2025/3/13 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3367 Pseudoforest 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:

對當前的一個圖,求一個最大的偽森林,即邊權(quán)值最大,每一個連通分量至多含有一個圈的森林。

分析:

類似于求一個最大生成樹,先將邊權(quán)值排序,之后就是一個加邊合并的過程,倆點所在邊可以加入到當前集合有倆個條件:

1.兩點在兩個集合,且有至少一個集合沒有環(huán)

2.兩點在一個集合,且這個集合沒有環(huán)

hdu3367 #include<iostream>
#include<algorithm>
using namespace std;
struct edge
{
int u,v,c;
}e[100005];
int f[10005],n,m;
bool ee[100005],ff[10005];
__int64 total;
bool cmp(edge a,edge b)
{
return a.c>b.c;
}
void init()
{
memset(ee,false,sizeof(ee));
memset(ff,false,sizeof(ff));
for(int i=0;i<n;i++)
f[i]=i;
}
int find(int x)
{
if(x==f[x])
return f[x];
f[x]=find(f[x]);
return f[x];
}
void Union(int x,int y,int c)
{
int a=find(x);
int b=find(y);
if(a==b) {//倆點在同一個集合,則當前若已經(jīng)包含有環(huán),則該邊不可加入
if(ff[a])return ;
total+=c;
ff[a]=true;
}
else {
if(ff[a]&&ff[b]) return ;//倆點不在同一個集合,則當倆個集合都已經(jīng)包含有環(huán)時,不可加入
total+=c;
f[b]=a;
if(ff[a] ||ff[b])
ff[a]=true;
}
}
int main()
{
while(scanf("%d %d",&n,&m)==2 && (n||m))
{
init();
for(int i=0;i<m;i++)
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].c);
sort(e,e+m,cmp);//將邊從大到小排序
total=0;
for(int i=0;i<m;i++)
Union(e[i].u,e[i].v,e[i].c);
printf("%I64d\n",total);
}
return 0;
}

?

轉(zhuǎn)載于:https://www.cnblogs.com/nanke/archive/2012/02/09/2344629.html

總結(jié)

以上是生活随笔為你收集整理的hdu3367 Pseudoforest的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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