2021-02-01

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

水一篇代码(最小生成树)


#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
struct edge
{
    int u,v,w;
    bool operator < (const edge &r)const{
        return w<r.w;
    }
}e[maxn*maxn];
int n,m,f[maxn];
int find(int x){
    return x==f[x]?x:f[x]=find(f[x]);
}
void kruskal(int n,int m){
    int res=0,num=0;
    sort(e+1,e+1+m);
    for(int i=1;i<=n;i++) f[i]=i;
    for (int i = 1; i <= m; i++)
    {
        int f1=find(e[i].u),f2=find(e[i].v);
        if (f1!=f2)
        {
            num++;
            res+=e[i].w;
            f[f1]=f2;
        }
        if (num==n-1)
            break;
    }
    if (num==n-1) printf("%d\n",res);
    else puts("?");
}
int main(){
    while (scanf("%d%d",&m,&n),m)
    {
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        kruskal(n,m);
    }   
}
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=110;
int n;
double d[maxn][maxn],min,dis[maxn];
int vis[maxn];
struct zh
{
    int x,y;
}a[maxn];
double di(int i,int j){
    return sqrt((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)*1.0); 
}
int main()
{
    int T;
    cin>>T;
    while (T--)
    {
       int k=1;
       double s=0;
       scanf("%d",&n);
       for(int i=1;i<=n;i++)  
        {  
            scanf("%d%d",&a[i].x,&a[i].y);  
        }  
        for (int i = 1; i <=n; i++)
        {
            for (int j = 1; j <=n; j++)
            {
                d[i][j]=d[j][i]=di(i,j);
                if(d[i][j]<10||d[i][j]>1000)
                    d[i][j]=d[j][i]=inf;
            }           
        }       
        for (int i = 1; i <= n; i++)
        {
            dis[i]=d[1][i];
        }
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        int t=0;
        for (int i = 1; i < n; i++)
        {
            double min=inf;
            for (int j = 1; j <= n; j++)
            {
                if (!vis[j]&&dis[j]<min)
                {
                    min=dis[j];
                    k=j;
                }
            }
            if(min==inf) break;
            t++;
            vis[k]=1;
            s+=min;
            for (int j = 1; j <= n; j++)
            {
                if(!vis[j]&&dis[j]>d[j][k])
                    dis[j]=d[j][k];
            }
            
        }
        if(t==n-1)
            printf("%.1lf\n",s*100);
        else
            printf("oh!\n");       
    }   
}
posted @ 2021-02-01 22:46  Star_tears  阅读(39)  评论(0)    收藏  举报