HDU 1875 畅通工程再续

来源:互联网 发布:罗技逆战宏编程 编辑:程序博客网 时间:2024/06/05 02:12
#include<stdio.h>#include<string.h>#include<math.h>const int INF = 0x3f3f3f3f;const int maxn = 1e3;double mp[maxn][maxn];  // 存图; int vis[maxn];  //是否在新图内; double dis[maxn];  //第i个顶点到新图最短距离; double prim(int n);struct node{double x;double y;}nodes[maxn];int n,m;int main (){int t;scanf("%d",&t);int cun1,cun2,cost;double ans = 0;for (int cas = 0; cas < t; cas++){scanf("%d", &m);memset(mp,0x3f,sizeof(mp));for (int i = 0; i < m; i++){scanf("%lf%lf", &nodes[i].x ,&nodes[i].y);}for (int i = 0; i < m; i++){for (int j = 0; j < m; j++){mp[i][j] =sqrt((nodes[i].x - nodes[j].x) *(nodes[i].x - nodes[j].x) +(nodes[i].y - nodes[j].y) *(nodes[i].y - nodes[j].y)) ;if (mp[i][j] < 10 || mp[i][j] > 1000){mp[i][j] = INF;}}}ans = prim(m);if (ans == -1)printf("oh!\n");else printf("%.1f\n",ans*100);}}double prim(int n){double ans = 0;memset(vis,0,sizeof(vis));vis[0] = 1;   //注意第一个点的初始化; for (int i = 0; i < n; i++)dis[i] = mp[0][i]; // 新图第一个点为0,初始化dis; for (int i = 1; i < n; i++){  // 加入第i+1个点 double minn = INF;  // 旧图到新图最短距离 int pos = -1;    // 旧图最近点标号; for (int j = 0; j < n; j++){if(!vis[j] && minn > dis[j]) {minn = dis[j];pos = j;}}if (minn == INF) return -1;ans += minn;     //更新答案; vis[pos] = 1;for (int j = 0; j < n; j++) {if (!vis[j] && mp[pos][j] < dis[j]){dis[j] = mp[pos][j];}}}return ans;}

原创粉丝点击