hud1875
来源:互联网 发布:conoha绑定域名 编辑:程序博客网 时间:2024/06/07 00:44
1.Prim算法
#include<iostream>#include<math.h>using namespace std;#define MAX_SIZE 102struct Point{double x, y;};bool visit[MAX_SIZE]; //记录点j是否在树中int Parent[MAX_SIZE]; //记录父节点double LowCost[MAX_SIZE]; //记录i到树最短距离double Prim(Point *P,int n);int main(){Point P[MAX_SIZE];int T, i, c;double res;scanf("%d",&T);while (T--){scanf("%d", &c);for (i = 1; i <= c; i++)scanf("%f%f",&P[i].x,&P[i].y); //输入坐标res = Prim(P, c);if (res < 0.00)printf("oh!\n");elseprintf("%.1f\n", 100 * res);}return 0;}double Distance(Point&a, Point&b){ //计算a,b两点距离return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}double Prim(Point *P, int n){int i, j, k, pos;double ans, dis, NowMin;for (i = 1; i <= n; i++)LowCost[i] = 1.00*INT_MAX; //赋值为无穷memset(visit, 0, sizeof(visit));j = 1;Parent[j] = -1; //设置为根结点 LowCost[j] = 0.00;ans =dis=0.00;visit[j] = 1; //将顶点1设置为根for (i = 2;i <= n; i++){for (k = 1; k <= n; k++){dis = Distance(P[j], P[k]);if (!visit[k] && dis >= 10.00&&dis <= 1000.00&&dis < LowCost[k]){Parent[k] = j;LowCost[k] = dis;}}pos = 1, NowMin = 1.00*INT_MAX;for (k = 1; k <= n; k++){if (!visit[k] && LowCost[k] < NowMin){pos = k;NowMin = LowCost[k];}}if (pos == 1)break; //这种情况说明没有可以连接的边了LowCost[pos] = 0.00;visit[pos] = 1; //将顶点pos加入到树中ans+= Distance(P[Parent[pos]], P[pos]);j = pos; //更新j}if (i <= n) //图连不通return -1.00;elsereturn ans;}
2.Kruskal算法
#include<iostream>#include<queue>#include<math.h>using namespace std;#define MAX_SIZE 102struct Point{double x, y;};struct Edge{double l;int v, w;bool operator<(const Edge&a)const{return l>a.l;}};int Parent[MAX_SIZE]; double Kruskal(priority_queue<Edge>&MinHeap,int n);int getParent(int i);bool Union(int i,int j);double Distance(Point&a, Point&b){ //计算a,b两点距离return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}int main(){Point P[MAX_SIZE];priority_queue<Edge>MinHeap;int T, i,j, c;double res,dis;Edge edge;scanf("%d",&T);while (T--){scanf("%d", &c);for (i = 1; i <= c; i++)scanf("%lf%lf", &P[i].x, &P[i].y); //输入坐标memset(Parent, -1, sizeof(Parent)); //初始化for (i = 1; i <= c;i++)for (j = i + 1; j <= c; j++){dis = Distance(P[i], P[j]);if (dis >= 10.00&&dis <= 1000.00){edge.v = i;edge.w = j;edge.l = dis;MinHeap.push(edge);}}res = Kruskal(MinHeap,c);if (res < 0.00)printf("oh!\n");elseprintf("%.1f\n", 100 * res);}return 0;}double Kruskal(priority_queue<Edge>&MinHeap,int n) {Edge edge;int m;double res=0.00;m = 0;while (!MinHeap.empty()){edge = MinHeap.top();MinHeap.pop();if (!Union(edge.v, edge.w)){m++; //m记录已连接的边数res += edge.l;}}if (m == n - 1)return res;return -1.00;}int getParent(int i){if (Parent[i] == -1)return i;return Parent[i] = getParent(Parent[i]);}bool Union(int i, int j){i = getParent(i);j = getParent(j);if (i == j)return true;Parent[i] = j;return false;}
0 0
- hud1875
- bzoj 3065: 带插入区间K小值 替罪羊树套主席树
- VC2013下使用64位libcurl(包含zlib1、ssleay32等)
- 由浅到深理解MySql数据库
- 规范完整APP开发制作流程
- java transient简介
- hud1875
- JAVA多线程之高级部分
- Yii2.0 插入多条记录操作中,旧的属性值影响插入操作的原因
- 一个国外博士生Andrews Sobral收集和测试的64个低秩+稀疏矩阵/张量分解的算法库
- 二维有序矩阵的查找
- 【HPU】[1735]老王修马路(一)
- 2015 UESTC Training for Dynamic Programming N - 导弹拦截 LIS nlog(n)+打印字典序最小的路径
- 字符编码笔记:ASCII,Unicode和UTF-8
- Windows下80端口被进程System&PID=4占用