2021-02-01


系列文章目录
  • 前言

  • 前言

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


    #include 
    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 
    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");       
        }   
    }
    
    ACM