图论之构造完全图

[复制链接]
发表于 2025-12-24 12:10:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
标题 2398: 
信息学奥赛一本通T1489-构造完全图

时间限定: 2s 内存限定: 192MB 提交: 16 办理: 9
标题形貌

对于完全图 G,如有且仅有一棵最小天生树为 T,则称完全图 G 是树 T 扩展出的。
给你一棵树 T,找出 T 能扩展出的边权和最小的完全图 G。
输入格式

第一行 N 体现树 T 的点数;
接下来 N−1 行三个整数 Si,Ti,Di ;形貌一条边(Si,Ti)权值为 Di ;
包管输入数据构成一棵树。
输特殊式

输出仅一个数,体现最小的完全图 G 的边权和。
样例输入

复制
  1. 4  
  2. 1 2 1  
  3. 1 3 1  
  4. 1 4 2
复制代码
样例输出

复制
  1. 12
复制代码
提示

样例分析
添加 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,否则就不满足最小天生树的唯一性。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+10;
  4. int p[N];
  5. int cnt[N];
  6. long long ans;
  7. struct edge{
  8.     int a,b,w;
  9.     bool operator<(edge&W){
  10.         return w<W.w;
  11.     }
  12. }e[N];
  13. int t;
  14. int find(int x){
  15.     if(x!=p[x]){
  16.         p[x]=find(p[x]);
  17.     }
  18.     return p[x];
  19. }
  20. int main()
  21. {
  22.     cin>>t;
  23.     for(int i=1;i<=t;i++){
  24.         p[i]=i;
  25.         cnt[i]=1;
  26.     }
  27.     for(int i=1;i<t;i++){
  28.         int a,b,c;
  29.         cin>>a>>b>>c;
  30.         e[i].a=a,e[i].b=b,e[i].w=c;
  31.     }
  32.     sort(e+1,e+t);
  33.     for(int i=1;i<t;i++){
  34.         int a=e[i].a;
  35.         int b=e[i].b;
  36.         int c=e[i].w;
  37.         int x=find(a);
  38.         int y=find(b);
  39.         if(x!=y){
  40.             p[x]=y;
  41.             ans+=(long long)(cnt[x]*cnt[y]-1)*(c+1);
  42.             cnt[y]=cnt[x]+cnt[y];
  43.             ans+=c;
  44.         }
  45.     }
  46.     cout<<ans;
  47. }
复制代码

123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表