九度1347解题报告
2014-03-01 19:48
197 查看
http://ac.jobdu.com/problem.php?pid=1347
孤岛连通问题的实质就是求图的最小生成树问题,若非连通图就输出no。这里使用的是Kruskal算法,将所有边排序后,依次判断是否能让不连通的两定点连通,若可以,则并入该边,把该边的代价算入总代价。最后输出从代价,即最小代价,如不连通,则为no,判断连通用到了并查集。代码如下
孤岛连通问题的实质就是求图的最小生成树问题,若非连通图就输出no。这里使用的是Kruskal算法,将所有边排序后,依次判断是否能让不连通的两定点连通,若可以,则并入该边,把该边的代价算入总代价。最后输出从代价,即最小代价,如不连通,则为no,判断连通用到了并查集。代码如下
#include <stdio.h> #include <algorithm> using namespace std; struct road { int a,b,d; bool operator < (const road &x) const { return d<x.d; } }road[10001]; int root[1001]; int getroot(int x) { if (root[x]==-1) return x; else { int temp=getroot(root[x]); root[x]=temp; return temp; } } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int n,m; while (scanf("%d %d",&n,&m)!=EOF) { for (int i=0;i<=n;++i) root[i]=-1; for (int i=0;i<m;++i) scanf("%d %d %d", &road[i].a,&road[i].b,&road[i].d); sort(road,road+m); int cost=0; for (int i=0;i<m;++i) { int a=getroot(road[i].a); int b=getroot(road[i].b); if (a!=b) { root[a]=b; cost+=road[i].d; } } int cnt=0; for (int i=1;i<=n;++i) if (root[i]==-1) ++cnt; if (cnt==1) printf("%d\n",cost); else printf("no\n"); } return 0; }
相关文章推荐
- 【九度OJ】题目1108:堆栈的使用 解题报告
- 【九度OJ】题目1064:反序数 解题报告
- 【九度OJ】题目1012:畅通工程 解题报告
- 【九度OJ】题目1024:畅通工程 解题报告
- 【九度OJ】题目1473:二进制数 解题报告
- 【九度OJ】题目1180:对称矩阵 解题报告
- 【九度OJ】题目1197:奇偶校验 解题报告
- 九度OJ题目1156:谁是你的潜在朋友解题报告
- 杭电OJ题 1347 Grandpa is Famous解题报告
- 九度教程93题 N阶楼梯上楼问题 解题报告
- 九度OJ 1047素数判定 解题报告
- 【九度OJ】题目1054:字符串内排序 解题报告
- 【九度OJ】题目1052:找x 解题报告
- 【九度OJ】题目1069:查找学生信息 解题报告
- 【九度OJ】题目1435:迷瘴 解题报告
- 【九度OJ】题目1074:对称平方数 解题报告
- 【九度OJ】题目1040:Prime Number 解题报告
- 【九度OJ】题目1137:浮点数加法 解题报告
- 【九度OJ】题目1175:打牌 解题报告
- 【九度OJ】题目1181:遍历链表 解题报告