第一题:最小生成树
#include<bits/stdc++.h>
using namespace std;
int n,m; //输入n个节点以及m条边
struct lu//结构体
{
int start;//连接到第一个节点
int end1;//第二个节点
long long l;//输入图之间的距离
}a[2000005];
int f[100005];
long long sum;//最小生成树的和
int count1;//判断已经连接的边数
int cha(int x)//差根
{
if(f[x]==x)
return x;
return cha(f[x]);
}
bool cmp(lu a1,lu b1)//判断条件
{
return a1.l<b1.l;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].start,&a[i].end1,&a[i].l);
}
sort(a,a+m,cmp);
for(int i=1;i<=m;i++)
{
int root1=cha(a[i].start);
int root2=cha(a[i].end1);
if(root1==root2)
continue;
sum+=a[i].l;
f[root2]=root1;
count1++;
if(count1==n-1)//当最小生成树边数达到的时候,就结束
break;
}
if(count1<n-1)//当不满足最小连通图,就orz
{printf("orz");
return 0;
}
printf("%d",sum);
return 0;
}
第二题:无线通讯网
#include<bits/stdc++.h>
using namespace std;
int s,p,count1;
struct lu
{
int start;
int end1;
double l;
}q[1000001];
int f[1000001];
int a[505],b[505];
double sum=0;
int cha(int x)
{
if(f[x]==x)
return x;
return cha(f[x]);
}
void bing(int root1,int root2)
{
if(root1==root2)
return ;
f[root2]=root1;
}
bool cmp(lu a1,lu b1)
{
return a1.l<b1.l;
}
int main()
{
scanf("%d%d",&s,&p);
for(int i=1;i<=p;i++)
{
f[i]=i;
}
for(int i=1;i<=p;i++)
{
scanf("%d%d",&a[i],&b[i]);
for(int j=1;j<i;j++)
{
count1++;
q[count1].start=i;
q[count1].end1=j;
q[count1].l=sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));
}
}
sort(q+1,q+1+count1,cmp);
int flag=0;
for(int i=1;i<=count1;i++)
{
if(cha(q[i].start)==cha(q[i].end1))
{
continue;
}
bing(cha(q[i].start),cha(q[i].end1));
sum=q[i].l;
flag++;
if(flag>=p-s)
{
printf("%.2lf",sum);
return 0;
}
}
return 0;
}