最小生成树裸(点密)——[Usaco2007 Dec]Building Roads 修建道路
Posted on 2011-03-17 21:02 huhuuu 阅读(724) 评论(0) 编辑 收藏 举报sqrt(1000000*1000000)数据发生超int处理办法,sqrt(1.0*1000000*1000000)即可
prim不超时
View Code
#include<cmath>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 0x3fffffff
int n,m;
struct data
{
int x,y;
}a[1009];
double map[1009][1009];
bool use[1009];
double dis[1009];
void prim()
{
int i,j,rj;
double add=0,min;
for(i=1;i<=n;i++)
{
use[i]=0;
dis[i]=map[1][i];
}
use[1]=1;
for(i=1;i<n;i++)
{
min=MAX;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]<min)
{
min=dis[j];
rj=j;
}
}
add+=min;
use[rj]=1;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]>map[rj][j])
dis[j]=map[rj][j];
}
}
printf("%.2lf\n",add);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
if(i==j)
{
map[i][j]=MAX;
}
else
{
map[i][j]=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+1.0*(a[i].y-a[j].y)*(a[i].y-a[j].y));//不然int会爆掉1000000*1000000
map[j][i]=map[i][j];
}
}
}
int a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=0;
map[b][a]=0;
}
prim();
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 0x3fffffff
int n,m;
struct data
{
int x,y;
}a[1009];
double map[1009][1009];
bool use[1009];
double dis[1009];
void prim()
{
int i,j,rj;
double add=0,min;
for(i=1;i<=n;i++)
{
use[i]=0;
dis[i]=map[1][i];
}
use[1]=1;
for(i=1;i<n;i++)
{
min=MAX;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]<min)
{
min=dis[j];
rj=j;
}
}
add+=min;
use[rj]=1;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]>map[rj][j])
dis[j]=map[rj][j];
}
}
printf("%.2lf\n",add);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
if(i==j)
{
map[i][j]=MAX;
}
else
{
map[i][j]=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+1.0*(a[i].y-a[j].y)*(a[i].y-a[j].y));//不然int会爆掉1000000*1000000
map[j][i]=map[i][j];
}
}
}
int a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=0;
map[b][a]=0;
}
prim();
}
return 0;
}
krus() 用G++提交double 要用 .f% 刚卡进
View Code
#include<cmath>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int add;
int f[1009];
struct data
{
int x,y;
}a[1009];
struct data1
{
int p1,p2;
double dis;
}dd[1000009];
int find(int pos)
{
if(f[pos]==-1)return pos;
return f[pos]=find(f[pos]);
}
int un(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)return 0;
f[fa]=fb;return 1;
}
bool cmp(data1 a,data1 b)
{
return a.dis<b.dis;
}
void krus()
{
sort(&dd[1],&dd[add],cmp);
int i;
double dall=0;
for(i=1;i<=add-1;i++)
{
if(un(dd[i].p1,dd[i].p2)==1)
dall+=dd[i].dis;
}
printf("%.2lf\n",dall);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
f[i]=-1;
}
add=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
dd[add].p1=i;
dd[add].p2=j;
if(i==j)
{
dd[add].dis=0;
}
else
{
dd[add].dis=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+1.0*(a[i].y-a[j].y)*(a[i].y-a[j].y));//????int??????1000000*1000000
}
add++;
}
}
int a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
un(a,b);
}
krus();
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int add;
int f[1009];
struct data
{
int x,y;
}a[1009];
struct data1
{
int p1,p2;
double dis;
}dd[1000009];
int find(int pos)
{
if(f[pos]==-1)return pos;
return f[pos]=find(f[pos]);
}
int un(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)return 0;
f[fa]=fb;return 1;
}
bool cmp(data1 a,data1 b)
{
return a.dis<b.dis;
}
void krus()
{
sort(&dd[1],&dd[add],cmp);
int i;
double dall=0;
for(i=1;i<=add-1;i++)
{
if(un(dd[i].p1,dd[i].p2)==1)
dall+=dd[i].dis;
}
printf("%.2lf\n",dall);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
f[i]=-1;
}
add=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
dd[add].p1=i;
dd[add].p2=j;
if(i==j)
{
dd[add].dis=0;
}
else
{
dd[add].dis=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+1.0*(a[i].y-a[j].y)*(a[i].y-a[j].y));//????int??????1000000*1000000
}
add++;
}
}
int a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
un(a,b);
}
krus();
}
return 0;
}