一、题目

口袋的天空

题目背景

小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述

给你云朵的个数 NNN,再给你 MMM 个关系,表示哪些云朵可以连在一起。

现在小杉要把所有云朵连成 KKK 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。

输入格式

第一行有三个数 N,M,KN,M,KN,M,K。

接下来 MMM 行每行三个数 X,Y,LX,Y,LX,Y,L,表示XXX云和 YYY 云可以通过 LLL 的代价连在一起。

输出格式

对每组数据输出一行,仅有一个整数,表示最小的代价。

如果怎么连都连不出 KKK 个棉花糖,请输出 No Answer

样例 #1

样例输入 #1

3 1 2
1 2 1

样例输出 #1

1

提示

对于 30%30\%30% 的数据,N≤100N \le 100N≤100,M≤103M \le 10^3M≤103;

对于 100%100\%100% 的数据,1≤N≤1031 \le N \le 10^31≤N≤103,1≤M≤1041 \le M \le 10^41≤M≤104,1≤K≤101 \le K \le 101≤K≤10,1≤X,Y≤N1 \le X,Y \le N1≤X,Y≤N,0≤L<1040 \le L<10^40≤L<104。

二、解题思路

1.做过P1194买礼物题的话,可以轻易看出该题仍为最小生成树的变体,区别在于该题为保留K个子图,而P1194为保留一个子图(整张图连通)。
2.不可避免的,该题仍然有坑。输入的边中存在自环,即边的两个端点为同一个点(也是醉了)。

三、代码

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;int N, M, K, k, ret=0;
bool adj[1001][1001]={0};//找到包含当前节点的连通图
void bfs(vector<int>& graph){bool visit[1001]={0};queue<int> q;q.push(graph[0]);visit[graph[0]]=1;while(!q.empty()){int now_node=q.front();q.pop();for(int i=0;i<N;i++){if(adj[now_node][i]&&(!visit[i])){visit[i]=1;graph.push_back(i);q.push(i);}}}
}
//判断新来的边是否要加入
bool judge(int index){int left=index/N, right=index%N;//如果这条边的两个端点已经连通,那么不应该加入if(adj[left][right])return false;else {//加入该条边vector<int> graph1, graph2;graph1.push_back(left);graph2.push_back(right);bfs(graph1);bfs(graph2);//将两个子图连通for(int i=0;i<graph1.size();i++){for(int j=0;j<graph2.size();j++){adj[graph1[i]][graph2[j]]=1;adj[graph2[j]][graph1[i]]=1;}}return true;}
}int main()
{cin>>N>>M>>K;k=N;int now_edge=0;map<int, vector<int>> edges;//存储单向边,并使用map完成排序for(int i=0;i<M;i++){int X,Y,L;cin>>X>>Y>>L;//如果是自环,不需要保存,肯定不会用它if(X==Y)continue;X-=1,Y-=1;edges[L].push_back(X*N+Y);}map<int, vector<int>>::iterator it=edges.begin();while(it!=edges.end()){int now_value=it->first;for(int i=0;i<it->second.size();i++){if(judge(edges[it->first][i])){k--;ret+=now_value;}if(k==K)break;}if(k==K)break;it++;}if(k==K)cout<<ret;else cout<<"No Answer";
}

P1195口袋的天空相关推荐

  1. 【P1195 口袋的天空】

    P1195 口袋的天空 口袋的天空 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 题意及分析 放代码 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗 ...

  2. P1111 修复公路P1195 口袋的天空

    目录 P1111 修复公路 P1195 口袋的天空 P1111 修复公路 题目链接:https://www.luogu.com.cn/problem/P1111 标签:并查集,最小生成树 思路:本题用 ...

  3. P1195 口袋的天空-Kruskal(优先队列+并查集)

    口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数 N N N,再给你 M M ...

  4. 洛谷 P1195 口袋的天空 (题解+代码)

    题目传送门:https://www.luogu.com.cn/problem/P1195 题解: 由于需要有k个棉花糖,则可理解为将云朵分成k个部分. 特判棉花糖大于云朵的数量,此时无解. 那么对于一 ...

  5. 【洛谷】P1195 口袋的天空

    明显看出为最小生成树, 那么:难点在哪里呢? if(cnt==n-k)//******{flag=1;break;} 为什么是cnt==n-k呢而不是k呢?!!! 解释:(如果每个已经连在一起了就不能 ...

  6. P1195 口袋的天空【并查集】

    题目链接 参考题解 有一句话说的是 如果n个点被n-1条边连接的话,这一定是棵树. 那么: 连的边数 得到的树的个数 n-1 1 n-2 2 n-3 3 - - n-k k 所以我们如果想要连出k棵树 ...

  7. 【c++图论】【口袋的天空】【部落划分】

    目标: 今天的两道题做法和思路有相同之处,合并在一起学习可以帮助更快的掌握图论中克鲁斯卡尔算法的要点和据具体实现步骤,下面来看看题目: 第一题[口袋的天空] 题目如下 题目背景 小杉坐在教室里,透过口 ...

  8. 最小生成树——洛谷并查集、口袋的天空

    最小生成树--并查集 简单模板题-洛谷3367并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作 ...

  9. 张韶涵《口袋的天空》小提琴谱片段

    很喜欢张韶涵<口袋的天空>这首歌,每次听感觉都很好.中间有一段小提琴的乐曲,听着特别感人. 找了很久的<口袋的天空>的小提琴谱,一直没有找到,终于有一次找到了这段小提琴谱,2分 ...

  10. VIJOS【1234】口袋的天空

    背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. ...

最新文章

  1. Ubuntu双系统Grub启动菜单修复
  2. python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
  3. seaJS简介和完整实例
  4. [architecture]-Generic Timer
  5. 7.SpringMVC 配置式开发-ModelAndView和视图解析器
  6. form.html,HTML表单form
  7. matplotlib 设置标注方向_Python 使用matplotlib画图添加标注、及移动坐标轴位置
  8. Paxos共识算法详解
  9. 【一周学术热点】预训练模型,文本生成,模型蒸馏
  10. 自定义Stack接口
  11. vue开发移动端app-学习记录
  12. Windows下Postman安装以及汉化
  13. 万能DOS启动盘制作全攻略(转)
  14. web前端开发期末大作业 ——个人主页(可自取源码)
  15. WIN10下PyCharm+Anaconda+PyTorch-GPU+CUDA9.2+cuDNN7.2环境搭建
  16. 傻妞机器人新版安装教程
  17. 抖音账号主页设置推荐机制
  18. linux中giep命令作用,Linux查看硬件信息以及驱动设备的命令
  19. 怎么在阿里妈妈投放广告?--人人有责-- .
  20. win10系统下Bitlocker密码忘了的具体解决方法

热门文章

  1. 电脑需要装杀毒软件吗?两个理由看完你做决定
  2. Puppet nginx+passenger模式配置
  3. 利用百度地图开放平台的Web API实现检索定位
  4. 【linux内核分析与应用-陈莉君】文件系统
  5. 微软专利技术介绍系列课程
  6. matlab 矩阵左右乘除
  7. [字节跳动]2018秋招算法题【持续更新中】
  8. Java 获取网络url图片返回file文件对象
  9. [计算机网络]十四、网卡的三种模式
  10. 遇到【java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter】的解决方案