最小生成树hdu1875再续畅通工程
来源:互联网 发布:网络打字员怎么做 编辑:程序博客网 时间:2024/06/05 12:47
Problem N
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 47 Accepted Submission(s) : 20
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
Output
Sample Input
2210 1020 2031 12 21000 1000
Sample Output
1414.2
#include<stdio.h>
#include<math.h>
#include<string.h>
#define max 9999999
double map[110][110],lowcost[110];
int n;
int visit[110];
struct point
{
double x,y;
}p[210];
int main()
{
int i,j,k,t;
double temp,x1,y1,min;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
memset(visit,0,sizeof(visit));
memset(lowcost,0,sizeof(lowcost));
int flag=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf %lf",&p[i].x,&p[i].y);
for(i=1;i<n;i++)
for(j=1;j<=n;j++)
{
x1=(p[i].x-p[j].x)*(p[i].x-p[j].x);
y1=(p[i].y-p[j].y)*(p[i].y-p[j].y);
temp=sqrt(x1+y1);
if(temp<10||temp>1000)
map[i][j]=map[j][i]=max;
else map[i][j]=map[j][i]=temp;
}
double sum=0.0;
visit[1]=1;
for(i=1;i<=n;i++)
lowcost[i]=map[1][i];
for(i=2;i<=n;i++)
{
min=max;
for(j=1;j<=n;j++)
{
if(!visit[j]&&lowcost[j]<min)
k=j;
min=lowcost[j];
}
if(min>=max||min<10)
{
flag=0;
break;
}
visit[k]=1;
sum+=min;
for(j=1;j<=n;j++)
{
if(!visit[j]&&lowcost[j]>map[k][j])
lowcost[j]=map[k][j];
}
}
if(flag==1)
printf("%.1lf\n",sum*100.0);
else
printf("oh!\n");
}
return 0;
}
这段代码不知道怎么哪里不对,求指教。。。。
下面贴ac代码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
struct point
{
double x,y;
};
point a[111];
double cost[111][111],maxn;
int t,n;
/*double jisuan(point aa,point bb)
//{
double ss;
ss=sqrt(pow(aa.x-bb.x,2.0)+pow(aa.y-bb.y,2.0));
return ss;
//}*/
/*void prim()
{
double lowcost[n],min,mincost=0.0;
long i,k,j;
bool bo[n];
for (i=1;i<=n;i++)
{
bo[i]=false;
lowcost[i]=cost[1][i];
}
bo[1]=true;
for (i=2;i<=n;i++)
{
min=maxn;
for (j=1;j<=n;j++)
if (!bo[j] && lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
if (min>=maxn || min<10.0)
{
k=1;
break;
}
bo[k]=true;
mincost+=min;
for (j=1;j<=n;j++)
if (!bo[j] && lowcost[j]>cost[k][j])
lowcost[j]=cost[k][j];
}
if (k!=1) printf("%0.1lf\n",mincost*100);
else printf("oh!\n");
}*/
int main()
{
scanf("%d",&t);
maxn=3000.0;
for (int k=1;k<=t;k++)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (i==j) cost[i][j]=0.0;
else cost[i][j]=maxn;
}
}
for (int i=1;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
double s;
for (int i=1;i<=n-1;i++)
for (int j=i+1;j<=n;j++)
{
//s=jisuan(a[i],a[j]);
// double ss;
s=sqrt(pow(a[i].x-a[j].x,2.0)+pow(a[i].y-a[j].y,2.0));
// return ss;
if (s<10.0 || s>1000.0) cost[i][j]=cost[j][i]=maxn;
else cost[i][j]=cost[j][i]=s;
}
//prim();
double lowcost[n],min,sum=0.0;
int i,k,j;
bool bo[n];
for (i=1;i<=n;i++)
{
bo[i]=false;
lowcost[i]=cost[1][i];
}
bo[1]=true;
for (i=2;i<=n;i++)
{
min=maxn;
for (j=1;j<=n;j++)
if (!bo[j] && lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
if (min>=maxn || min<10.0)
{
k=1;
break;
}
bo[k]=true;
sum+=min;
for (j=1;j<=n;j++)
if (!bo[j] && lowcost[j]>cost[k][j])
lowcost[j]=cost[k][j];
}
if (k!=1) printf("%0.1lf\n",sum*100);
else printf("oh!\n");
}
return 0;
}
- 最小生成树 Prim hdu1875 畅通工程再续
- 最小生成树hdu1875再续畅通工程
- Hdu1875 - 畅通工程再续 - 最小生成树
- HDU1875 畅通工程再续 【最小生成树Prim】
- hdu1875畅通工程再续【最小生成树】
- hdu1875 畅通工程再续(最小生成树kruskal算法)
- HDU1875-畅通工程再续-最小生成树
- hdu1875 畅通工程再续 (KRUSKAL求最小生成树)
- 最小生成树模板题 HDU1875 畅通工程再续
- hdu1875 畅通工程再续【最小生成树】
- hdu1875 畅通工程再续 (最小生成树之prim 算法)
- ACM-最小生成树之畅通工程再续——hdu1875
- hdu1875 畅通工程再续 并查集+kruskal最小生成树
- hdu1875 畅通工程再续 最小生成树(prim算法)
- hdu1875——畅通工程再续(最小生成树)
- HDU1875 畅通工程再续(最小生成树,Prim,kruskal算法)
- HDU1875畅通工程之最小生成树——kruskal
- HDU1875 通畅工程再续 最小生成树
- java堆栈 (转)
- Jsou简介
- android程序编译后无法生成R.java文件
- zoj2781------------------------Rounders
- 学习、使用C++开发是不是过时了?
- 最小生成树hdu1875再续畅通工程
- IAR:Error[Li005]:no definition for "Delayn"
- Web架构师成长之路
- linux下GCC动态库的链接
- Howto merge using the ClearCase Merge manager
- 如何从DLL中生成LIB文件
- POJ 3254 状态压缩DP
- Git学习笔记(十二) 前几章的补充
- hdu_4345 Permutation(记忆化搜索)