HDU 1863 畅通工程
2015-08-08 11:05
218 查看
水最小生成树 测试下模板 直接贴代码了
prim算法的
prim算法的
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #include<set> #include<stack> #define bug puts("bugbugbug"); using namespace std; typedef long long ll; //适合稠密图 复杂度n*n n为点数 const int INF=1000000010; const int N=105;//N 为点的数量 int vis ,dis ; vector<int> V ;//邻接表存边 int g ={0};//邻接矩阵存边 int n,m; int prim() { memset(vis, 0,sizeof(vis)); for (int i = 1; i <= n; i++) dis[i] = i==1? 0 : INF;//初始化 int ans = 0; int i; for (i = 1; i <= n; i++) { int k = -1, minn = INF; for (int j = 1; j <= n; j++) if (!vis[j] && dis[j] < minn) { minn = dis[j]; k = j; } if (k == -1) break; vis[k] = 1, ans += dis[k]; for (int j = 0; j < V[k].size(); j++) { int u = V[k][j]; if (!vis[u] && g[k][u] < dis[u]) dis[u] = g[k][u]; } } if(i!=n+1)return -1; return ans; } int main() { while(~scanf("%d%d",&m,&n)&&m) { for(int i=0;i<=n;i++) V[i].clear(); memset(g,0,sizeof(g)); for(int i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); V[a].push_back(b); V[b].push_back(a); g[a][b]=g[b][a]=c; } int ans=prim(); if(ans==-1) puts("?"); else printf("%d\n",ans); } }Kruscal的
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #include<set> #include<stack> #define bug puts("bugbugbug"); using namespace std; typedef long long ll; const int maxm=10005; int f[105]; int n,m; struct node { int x, y, v; bool operator<(const node &b)const{ if(this->v!=b.v) return (this->v<b.v); if(this->x!=b.x) return (this->x<b.x); return (this->y<b.y); } } e[maxm]; int find(int x){ return f[x]= f[x]==x?x:find(f[x]); } int Kruscal() { sort(e, e + m); int cnt = n, ans = 0; for(int i = 0; i < n; i++) f[i] = i; for (int i = 0; i < m; i++) { int x = find(e[i].x); int y = find(e[i].y); if (x != y) { f[x] = y; cnt--; ans += e[i].v; if (cnt == 1) break; } } if(cnt!=1)return -1; return ans; } int main() { while(~scanf("%d%d",&m,&n)&&m) { for(int i=0;i<m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v); int ans=Kruscal(); if(ans==-1) puts("?"); else printf("%d\n",ans); } }
相关文章推荐
- Cocos2D游戏之旅(四):卡牌翻转效果的实现(下)
- wordpress常见的问题
- [算法专题] 深度优先搜索&回溯剪枝
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
- Road System HUST 1631 最小生成树
- Java容器
- c++自定义string类
- activemq in action
- 取石子游戏(hdu2516+FIB博弈)
- 面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字
- ORACLE 定时执行存储过程
- [算法专题] 深度优先搜索&回溯剪枝
- 南邮 OJ 2074 pdf的旅游
- windows server 2008 R2设置远程访问用户数
- 3126POJ
- [CareerCup] 4.8 Contain Tree 包含树
- .net 架构师/经理招聘,长期有效
- [算法专题] 深度优先搜索&回溯剪枝
- sublime学习心得
- UIAlertView 实现自动消失