马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
标题 2398:
信息学奥赛一本通T1489-构造完全图
时间限定: 2s 内存限定: 192MB 提交: 16 办理: 9
标题形貌
对于完全图 G,如有且仅有一棵最小天生树为 T,则称完全图 G 是树 T 扩展出的。
给你一棵树 T,找出 T 能扩展出的边权和最小的完全图 G。
输入格式
第一行 N 体现树 T 的点数;
接下来 N−1 行三个整数 Si,Ti,Di ;形貌一条边(Si,Ti)权值为 Di ;
包管输入数据构成一棵树。
输特殊式
输出仅一个数,体现最小的完全图 G 的边权和。
样例输入
复制样例输出
复制提示
样例分析
添加 D(2,3)=2,D(3,4)=3,D(2,4)=3 即可。
数据范围:
对于 20% 的数据,N≤10;
对于 50% 的数据,N≤1000;
对于 100% 的数据,N≤105,1≤Di≤105 。
思绪:
类似于kruskal创建过程,先找到最小树边,再在此底子上加边,使其成为一个局部完全图。依次举行,末了就得到一个最小权完全图。注意加边时边权应该为最小树边权加1,否则就不满足最小天生树的唯一性。- #include<bits/stdc++.h>
- using namespace std;
- const int N=1e5+10;
- int p[N];
- int cnt[N];
- long long ans;
- struct edge{
- int a,b,w;
- bool operator<(edge&W){
- return w<W.w;
- }
- }e[N];
- int t;
- int find(int x){
- if(x!=p[x]){
- p[x]=find(p[x]);
- }
- return p[x];
- }
- int main()
- {
- cin>>t;
- for(int i=1;i<=t;i++){
- p[i]=i;
- cnt[i]=1;
- }
- for(int i=1;i<t;i++){
- int a,b,c;
- cin>>a>>b>>c;
- e[i].a=a,e[i].b=b,e[i].w=c;
- }
- sort(e+1,e+t);
- for(int i=1;i<t;i++){
- int a=e[i].a;
- int b=e[i].b;
- int c=e[i].w;
- int x=find(a);
- int y=find(b);
- if(x!=y){
- p[x]=y;
- ans+=(long long)(cnt[x]*cnt[y]-1)*(c+1);
- cnt[y]=cnt[x]+cnt[y];
- ans+=c;
- }
- }
- cout<<ans;
- }
复制代码
123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |