hdu 1102 uva 10397(最小生成树prim)
来源:互联网 发布:西安软件公寓 编辑:程序博客网 时间:2024/06/06 12:57
hdu 1102:
题意:
给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。
解析:
把已经修的路的权值改为0,套个prim()。
注意prim 最外层循坏为n-1。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long longusing namespace std;const int maxn = 100 + 10;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const double pi = 4 * atan(1.0);const double ee = exp(1.0);int n;int g[maxn][maxn];int prim(){ bool vis[maxn]; int dis[maxn]; memset(vis, false, sizeof(vis)); memset(dis, inf, sizeof(dis)); vis[1] = true; dis[1] = 0; int res = 0; int mark = 1; for (int i = 1; i <= n - 1; i++)///mark = 1 so n - 1 { for (int j = 1; j <= n; j++) { if (!vis[j] && g[mark][j] < dis[j]) dis[j] = g[mark][j]; } int mindis = inf; for (int j = 1; j <= n; j++) { if (!vis[j] && dis[j] < mindis) { mindis = dis[j]; mark = j; } } vis[mark] = true; res += mindis; } return res;}int main(){ #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &g[i][j]); } } int q; scanf("%d", &q); while (q--) { int u, v; scanf("%d%d", &u, &v); g[u][v] = g[v][u] = 0; } printf("%d\n", prim()); } return 0;}
uva 10397:
基本上是一样的题目。。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long longusing namespace std;const int maxn = 750 + 10;const int inf = sqrt(2 * 20000 * 20000) + 10;int n;double g[maxn][maxn];double x[maxn], y[maxn];double dist(double x1, double y1, double x2, double y2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}double prim(){ double dis[maxn]; bool vis[maxn]; for (int i = 0; i <= n; i++) { dis[i] = inf; vis[i] = false; } dis[1] = 0.0; vis[1] = true; double res = 0.0; int mark = 1; for (int i = 1; i <= n - 1; i++) { for (int j = 1; j <= n; j++) { if (!vis[j] && g[mark][j] < dis[j]) dis[j] = g[mark][j]; } double mindis = inf; for (int j = 1; j <= n; j++) { if (!vis[j] && dis[j] < mindis) { mindis = dis[j]; mark = j; } } vis[mark] = true; res += mindis; } return res;}int main(){ #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) { scanf("%lf%lf", &x[i], &y[i]); } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { g[i][j] = g[j][i] = dist(x[i], y[i], x[j], y[j]); } } int q; scanf("%d", &q); for (int i = 0; i < q; i++) { int u, v; scanf("%d%d", &u, &v); g[u][v] = g[v][u] = 0; }// for (int i = 1; i <= n; i++)// {// for (int j = 1; j <= n; j++)// {// printf("%.2lf ", g[i][j]);// }// printf("\n");// } printf("%.2lf\n", prim()); } return 0;}
0 0
- hdu 1102 uva 10397(最小生成树prim)
- HDU-1102(prim求最小生成树)
- hdu 1102 最小生成树 prim
- HDU 3371(最小生成树,Prim)
- HDU - 1102 - Constructing Roads (最小生成树--prim算法!!)
- HDU 1102 Constructing Roads(Prim求最小生成树)
- HDU-1102 Constructing Roads(最小生成树[Prim])
- HDU 1102 Constructing Roads(最小生成树-Prim)
- hdu 1102 Constructing Roads(最小生成树,prim)
- HDU 1102 Constructing Roads(prim求最小生成树)
- HDU 1102 Constructing Roads (最小生成树 Prim算法)
- UVa 10807 Prim(最小生成树+二进制枚举)
- hdu 1102 Constructing Roads(Prim最小生成树)
- 【最小生成树+Prim】杭电 hdu 1102 Constructing Roads
- hdu-1102 Constructing Roads(prim最小生成树)
- hdu 1102 Constructing Roads(最小生成树 Prim)
- hdu 1102 Constructing Roads(最小生成树prim)
- hdu 1102 Constructing Roads 最小生成树prim模板题
- openGL es2.0 创建和管理shader
- SQL update select语句及应用
- reids客户端 redis-cli用法
- 压缩图片
- ORACLE 数据库名、实例名、ORACLE_SID的区别
- hdu 1102 uva 10397(最小生成树prim)
- HDU 4198 Quick out of the Harbour(优先队列 + bfs)
- Java 泛型小结
- 修改MYSQL提示符
- MongoDB学习 (五):查询操作符(Query Operators).1st
- Object.clone()方法
- 浏览器不同语言切换不同页面
- 怎么关闭指定端口 3306
- 【转载】Java之美[从菜鸟到高手演变]之设计模式二