[kuangbin带你飞]专题六 最小生成树

学习最小生成树已经有一段时间了 做一些比较简单的题还算得心应手..花了三天的时间做完了kuangbin的专题 写一个题解出来记录一下(虽然几乎都是模板题)

做完的感想:有很多地方都要注意 n == 1

注意double 的精度问题

poj 1251 模板题 大写字母减去‘A‘+1即是它的编号

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
struct edge
{
    int u,v,w;
};
edge a[30000];
int fa[50];
int cmp(edge a,edge b)
{
    return a.w<b.w;
}
int find(int x)
{
    if(fa[x]==x)
    return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
    return ;
    fa[fx]=fy;
    return ;
}
int n;
int tot;
int kru()
{
    int cnt=0;
    int res=0;
    for(int i=0;i<tot;i++)
    {
        int u=a[i].u;
        int v=a[i].v;
        int w=a[i].w;
        if(find(u)!=find(v))
        {
            un(u,v);
            cnt++;
            res+=w;

        }
        if(cnt==n-1)
        return res;
    }
    return -1;
}
int main(){
while(~scanf("%d",&n))
{
    if(n==0)
    break;
    tot=0;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=n-1;i++)
    {
        char u[20],v[20];
        scanf("%s",u);
        int ma;
        scanf("%d",&ma);
        int uu=u[0]-‘A‘+1;
        for(int k=1;k<=ma;k++)
        {
            scanf("%s",v);
            int w;
            scanf("%d",&w);
            int vv=v[0]-‘A‘+1;
            a[tot].u=uu;
            a[tot].v=vv;
            a[tot++].w=w;
        }
    }
    sort(a,a+tot,cmp);
    int ans=kru();
    printf("%d\n",ans);
}
}

poj 1287 极裸的kru算法

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n,m;
int ta[70][70];
int fa[70];
struct node
{
    int u,v,w;
};
node a[2700];
int tot;
void init(){
for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    else return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return ;
    fa[fx]=fy;
    return ;
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int kru()
{
    int res=0;
    int cnt=0;
    init();
    for(int i=0;i<tot;i++)
    {
        int u=a[i].u;
        int v=a[i].v;
        int w=a[i].w;
        if(find(u)!=find(v))
        {
            un(u,v);
            res+=w;
            cnt++;
        }
        if(cnt==n-1)
            return res;
    }
}
int main(){
while(scanf("%d",&n)!=EOF)
{
    if(n==0)
        break;
    scanf("%d",&m);
    for(int i=1;i<=n;i++)
    for(int k=1;k<=n;k++)
    {
        ta[i][k]=999999999;
        if(i==k)
            ta[i][k]=0;
    }
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        if(ta[u][v]>w)
            ta[u][v]=ta[v][u]=w;
    }
    tot=0;
    for(int i=1;i<=n;i++)
    for(int k=i+1;k<=n;k++)
    {
        if(ta[i][k]!=999999999)
        {
            a[tot].u=i;
            a[tot].v=k;
            a[tot].w=ta[i][k];
            tot++;
        }
    }
    sort(a,a+tot,cmp);
    int ans=kru();
    printf("%d\n",ans);
}
}

poj 2031 给出空间站的三维坐标和它可允许的行走半径 问需要建造多长的太空走廊可以联通 kru加个判断

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n;
struct node
{
    int u,v;
    double w;
};
int fa[105];
int tot;
node a[10050];
struct point
{
    double x,y,z;
    double r;
};
point b[105];
void init()
{
    for(int i=1;i<=n;i++)fa[i]=i;
}
double ji(double x1,double y1,double x2,double y2)
{
    return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return ;
    fa[fx]=fy;
    return ;
}
double kru()
{
    double res=0.0;
    int cnt=0;
    init();
    for(int i=0;i<tot;i++)
    {
        int u=a[i].u;
        int v=a[i].v;
        double w=a[i].w;
        if(find(u)!=find(v))
        {
            res+=w;
            cnt++;
            un(u,v);
        }
        if(cnt==n-1)
            return res;
    }
    return -1;
}
double cmp(node aa,node bb)
{
    return aa.w<bb.w;
}
int main(){
while(~scanf("%d",&n))
{
    if(n==0)
        break;
    tot=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf%lf%lf",&b[i].x,&b[i].y,&b[i].z,&b[i].r);
    }
    if(n==1)
        printf("0.000\n");
    else
    {
    for(int i=1;i<=n;i++)
    {
        for(int k=i+1;k<=n;k++)
        {
            int u=i;
            int v=k;
            double w=sqrt(ji(b[i].x,b[i].y,b[k].x,b[k].y)+(b[i].z-b[k].z)*(b[i].z-b[k].z));
            w-=b[i].r;
            w-=b[k].r;
            if(w<0.0)
                w=0.0;
            a[tot].u=u;
            a[tot].v=v;
            a[tot].w=w;
            tot++;
        }
    }
    sort(a,a+tot,cmp);
    double ans=kru();
    printf("%.3f\n",ans);
    }
}
}

poj 2421 给出各点之间的联系 再给出已经连好的边(这时候用un操作一下) 然后kru

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int fa[105];
int n;
int tot;
int cnt;
int ta[105][105];
void init()
{
    for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
    return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
    return ;
    fa[fx]=fy;
    return ;
}
struct node
{
    int u,v,w;
};
node a[10050];
int cmp(node a,node b)
{
    return a.w<b.w;
}
int kru()
{
    int res=0;
    cnt=0;
    if(cnt==n-1)
    return res;
    for(int i=0;i<tot;i++)
    {
        int u=a[i].u;
        int v=a[i].v;
        int w=a[i].w;
        if(find(u)!=find(v))
        {
            res+=w;
            un(u,v);
            cnt++;
        }
        if(cnt==n-1)
        return res;
    }
    return -1;
}
int main(){
while(~scanf("%d",&n))
{
    init();
    cnt=0;
    tot=0;
    for(int i=1;i<=n;i++)
    for(int k=1;k<=n;k++)
    {
        scanf("%d",&ta[i][k]);
    }
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        ta[u][v]=0;
        ta[v][u]=0;
    }
    for(int i=1;i<=n;i++)
    for(int k=1;k<=n;k++)
    {
        if(i<k)
        {
            a[tot].u=i;
            a[tot].v=k;
            a[tot].w=ta[i][k];
            tot++;
        }
    }
    sort(a,a+tot,cmp);
    int ans=kru();
    printf("%d\n",ans);
}
}

zoj 1586 每条边都要加上u v 所喜爱的插座的价格

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n;
int tot;
int price[1005];
int ta[1005][1005];
int fa[1005];
struct node
{
    int u,v;
    int w;
};
node a[1000050];
void init()
{
    for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
    return ;
    fa[fx]=fy;
    return ;
}
int kru()
{
    init();
    int res=0;
    int cnt=0;
    for(int i=0;i<tot;i++)
    {
        int u,v,w;
        u=a[i].u;
        v=a[i].v;
        w=a[i].w;
        if(find(u)!=find(v))
        {
            un(u,v);
            res+=w;
            cnt++;
        }
        if(cnt==n-1)
            return res;
    }
    return -1;
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&price[i]);
    for(int i=1;i<=n;i++)
    for(int k=1;k<=n;k++)
    {
        scanf("%d",&ta[i][k]);
    }
    tot=0;
    if(n==1)
        printf("0\n");
    else
    {
    for(int i=1;i<=n;i++)
    for(int k=i+1;k<=n;k++)
    {
        a[tot].u=i;
        a[tot].v=k;
        a[tot].w=ta[i][k]+price[i]+price[k];
        tot++;
    }
    sort(a,a+tot,cmp);
    int ans=kru();
    printf("%d\n",ans);
    }
}
}

poj 1789 如果两个字符串相同位置上的字母不同 res就加一 开始没读懂题意而被坑

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n;
int tot;
struct node{
int u,v,w;
};
struct code{
char s[10];
};
code b[2050];
int did(char s1[10],char s2[10])
{
    int len=7;
    int res=0;
    for(int i=0;i<len;i++)
    {
        if(s1[i]!=s2[i])
            res++;
    }
    return res;
}
node a[5000050];
int fa[2050];
void init(){
for(int i=1;i<=n;i++)
    fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return ;
    fa[fx]=fy;
    return ;
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int kru(){
int res=0;
int cnt=0;
for(int i=0;i<tot;i++)
{
    int u=a[i].u;
    int v=a[i].v;
    int w=a[i].w;
    if(find(u)!=find(v))
    {
        un(u,v);
        cnt++;
        res+=w;
    }
    if(cnt==n-1)
        return res;
}
return -1;
}
int main(){
while(~scanf("%d",&n))
{
    if(n==0)
        break;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",b[i].s);
    }
    tot=0;
    for(int i=1;i<=n;i++)
    {
        for(int k=i+1;k<=n;k++)
        {
            a[tot].u=i;
            a[tot].v=k;
            a[tot].w=did(b[i].s,b[k].s);
            tot++;
        }
    }
    if(n==1)
        printf("The highest possible quality is 1/1.\n");
    else{
    init();
    sort(a,a+tot,cmp);
    int ans=kru();
    printf("The highest possible quality is 1/%d.\n",ans);
    }
}
}

poj 2349 给出点的数目和...空间跳跃传送器的个数?利用当年打机战的想象力强行A掉...

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int m,n;
struct node{
    double x;
    double y;
};
node a[505];
int fa[505];
int tot;
struct edge{
int u,v;
double w;
};
edge b[250050];
void init(){
for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x){
if(fa[x]==x)
    return x;
return fa[x]=find(fa[x]);
}
void un(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy)
    return ;
fa[fx]=fy;
return ;
}
double kru(){
int cnt=m-1;
double res=0;
double ans=0;
if(cnt==n-1)
    return res;
init();
for(int i=0;i<tot;i++){
    int u=b[i].u;
    int v=b[i].v;
    double w=b[i].w;
    if(find(u)!=find(v)){
        cnt++;
        un(u,v);
        res+=w;
        ans=w;
    }
    if(cnt==n-1){
        return ans;
    }
}
return -1;
}
int cmp(edge a,edge b){
return a.w<b.w;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    tot=0;
    if(n==1)
    {
        printf("0.00\n");
    }
    else{
    for(int i=1;i<=n;i++){
        for(int k=i+1;k<=n;k++){
            int u,v;
            double w;
            u=i;
            v=k;
            w=sqrt((a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y));
            b[tot].u=u;
            b[tot].v=v;
            b[tot].w=w;
            tot++;
        }
    }
    sort(b,b+tot,cmp);
    /*for(int i=0;i<tot;i++){
        printf("%d %d %.2f\n",b[i].u,b[i].v,b[i].w);
    }*/
    double ans=kru();
    printf("%.2f\n",ans);
    }
}
}

poj 1751 kru 给出已经连接的边 记录一下将要连接的边

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n,m;
struct point
{
    double x,y;
};
point po[800];
int fa[800];
int tot;
struct node
{
    int u,v;
    double w;
};
node a[640000];
void init(){
for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy)
return ;
fa[fx]=fy;
return ;
}
int cnt;
int cmp(node a, node b)
{
    return a.w<b.w;
}
int kru(){
double res=0;
for(int i=0;i<tot;i++){
    int u=a[i].u;
    int v=a[i].v;
    double w=a[i].w;
    if(find(u)!=find(v))
    {
        un(u,v);
        cnt++;
        res+=w;
        printf("%d %d\n",u,v);
    }
    if(cnt==n-1)
        return res;
}
return -1;
}
int main(){
while(~scanf("%d",&n))
{
    tot=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&po[i].x,&po[i].y);
    }
    init();
    for(int i=1;i<=n;i++)
    {
        for(int k=i+1;k<=n;k++)
        {
            a[tot].u=i;
            a[tot].v=k;
            a[tot].w=sqrt((po[i].x-po[k].x)*(po[i].x-po[k].x)+(po[i].y-po[k].y)*(po[i].y-po[k].y));
            tot++;
        }
    }
    sort(a,a+tot,cmp);
    cnt=0;
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        if(find(u)!=find(v))
        {
            un(u,v);
            cnt++;
        }
    }
    if(cnt==n-1)
        printf("\n");
    else
    {
        int ans=kru();
    }
}
}

poj 1258 模板kru ..(虽然我是用prim打的..真的很省代码...)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n;
int ans;
int ta[105][105];
int dis[105];
int vis[105];
void prim(){
for(int i=1;i<=n-1;i++){
    int minn=999999999;
    int w=0;
    for(int k=1;k<=n;k++){
        if(vis[k])
        if(dis[k]<minn){
            minn=dis[k];
            w=k;
        }
    }
    vis[w]=0;
    ans+=dis[w];
    for(int k=1;k<=n;k++){
        if(vis[k])
        if(ta[w][k]<dis[k]){
            dis[k]=ta[w][k];
        }
    }
}
}
int main(){
while(~scanf("%d",&n)){
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=n;k++)
            scanf("%d",&ta[i][k]);
    }
    ans=0;
    for(int i=1;i<=n;i++){
        dis[i]=999999999;
        vis[i]=1;
    }
    vis[1]=0;
    dis[1]=0;
    for(int i=2;i<=n;i++)
    {
        dis[i]=ta[i][1];
    }
    prim();
    printf("%d\n",ans);
}
}

poj 3026 kru混合bfs 因为数据范围小所以不会超时 被吃字符的原因弄得好累..需要注意的是 输入n m后 getchar会wa..因为n m后有多个空格?(网上说的)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
int n,m;
int fa[105];
char a[55][55];
bool vis[55][55];
int hao[55][55];
int geshu;
struct node
{
    int u,v,w;
};
int bian;
node b[50050];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
void bfs(int x,int y)
{
    queue<int >q;
    q.push(x);
    q.push(y);
    int tot=0;
    q.push(tot);
    vis[x][y]=false;
    int u,v,w;
    u=hao[x][y];
    while(!q.empty())
    {
        x=q.front();q.pop();
        y=q.front();q.pop();
        tot=q.front();q.pop();
        tot++;
        int xx,yy;
        for(int i=0;i<4;i++)
        {
            xx=x+dx[i];yy=y+dy[i];
            if(xx>=0&&xx<n&&yy>0&&yy<m)
            {
                if(vis[xx][yy]==true)
                {
                    if(a[xx][yy]!=‘#‘)
                    {
                        vis[xx][yy]=false;
                        if(a[xx][yy]!=‘ ‘)
                        {
                            v=hao[xx][yy];
                            w=tot;
                            b[bian].u=u;
                            b[bian].v=v;
                            b[bian].w=w;
                            bian++;
                        }
                        q.push(xx);
                        q.push(yy);
                        q.push(tot);
                    }
                }
            }
        }
    }
}
void init(){
for(int i=1;i<=geshu;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return ;
    fa[fx]=fy;
    return ;
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int kru(){
int res=0;
int cnt=0;
for(int i=0;i<bian;i++)
{
    int u=b[i].u;
    int v=b[i].v;
    int w=b[i].w;
    if(find(u)!=find(v))
    {
        un(u,v);
        cnt++;
        res+=w;
    }
    if(cnt==geshu-1)
        return res;
}
return -1;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%d%d",&m,&n);
    char tr[55];
    gets(tr);
    for(int i=0;i<n;i++)
      {
          gets(a[i]);
      }
    bian=0;
    geshu=0;
    for(int i=0;i<n;i++)
    {
        for(int k=0;k<m;k++)
        {
            if(a[i][k]==‘A‘||a[i][k]==‘S‘)
            {
                geshu++;
                hao[i][k]=geshu;
            }
        }
    }
    init();
    //printf("%d\n",geshu);
    if(geshu==1){
        printf("0\n");
    }
    else{
    for(int i=0;i<n;i++)
    {
        for(int k=0;k<m;k++)
        {
            if(a[i][k]==‘A‘||a[i][k]==‘S‘)
            {
                memset(vis,true,sizeof(vis));
                bfs(i,k);
            }
        }
    }
    sort(b,b+bian,cmp);
    int ans=kru();
    printf("%d\n",ans);
    }
}
}

poj 1679 到连接第n-1条边的时候找一下 是否有多条边满足?

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n,m;
int fa[105];
int tot;
struct node
{
    int u,v,w;
};
node a[10050];
void init()
{
    for(int i=1; i<=n; i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return ;
    fa[fx]=fy;
    return ;
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int kru()
{
    int res=0;
    int cnt=0;
    init();
    for(int i=0; i<tot; i++)
    {
        int u=a[i].u;
        int v=a[i].v;
        int w=a[i].w;
        if(find(u)!=find(v))
        {
            res+=w;
            int many=0;
            if(cnt==n-2)
            {
                for(int k=i; a[k].w==a[i].w; k++)
                {
                    if(find(a[k].u)!=find(a[k].v))
                    {
                        many++;
                    }
                }
                if(many==1)
                {
                    un(u,v);
                    return res;
                }
                else return -1;
            }
            else
            {
                un(u,v);
            }
            cnt++;
        }
        if(cnt==n-1)
            return res;

    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        tot=0;
        int u,v,w;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            a[tot].u=u;
            a[tot].v=v;
            a[tot].w=w;
            tot++;
        }
        if(n==1)
            printf("0\n");
        else{
        sort(a,a+tot,cmp);
        int ans=kru();
        if(ans==-1)
            printf("Not Unique!\n");
        else printf("%d\n",ans);
        }
    }
}

hdu 1233 kru的模板懒得放代码了...

hdu 1301 和第一道题是同一道..

hdu 1875 有限制条件 判断一下即可

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int n;
int tot;
int fa[105];
void init()
{
    for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=find(fa[x]);
}
void un(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
    return ;
    fa[fx]=fy;
    return ;
}
struct point
{
    double x;
    double y;
};
point po[105];
struct node
{
    int u,v;
    double w;
};
node a[10050];
int cmp(node a,node b)
{
    return a.w<b.w;
}
double kru(){
init();
double res=0;
int cnt=0;
int i;
for(i=0;i<tot;i++)
{
    if(a[i].w<10.0)
        continue;
    if(a[i].w>1000.0)
        break;
    int u,v;
    double w;
    u=a[i].u;
    v=a[i].v;
    w=a[i].w;
    if(find(u)!=find(v))
    {
        cnt++;
        res+=w;
        un(u,v);
    }
    if(cnt==n-1)
        return res;
}
return -1;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%d",&n);
    tot=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&po[i].x,&po[i].y);
    }
    if(n==1)
        printf("0.0\n");
    else
    {
    for(int i=1;i<=n;i++)
    for(int k=i+1;k<=n;k++)
    {
        a[tot].u=i;
        a[tot].v=k;
        a[tot].w=sqrt((po[i].x-po[k].x)*(po[i].x-po[k].x)+(po[i].y-po[k].y)*(po[i].y-po[k].y));
        tot++;
    }
    sort(a,a+tot,cmp);
    double ans=kru();
    int many=0;
    for(int i=1;i<=n;i++)
    {
        if(fa[i]==i)many++;
    }
    ans*=100.0;
    if(many==1)
        printf("%.1f\n",ans);
    else printf("oh!\n");
    }
}
}
时间: 2024-10-06 01:14:51

[kuangbin带你飞]专题六 最小生成树的相关文章

[kuangbin带你飞]专题六 最小生成树 G - Arctic Network

G - Arctic Network 题目链接:https://vjudge.net/contest/66965#problem/G 题目: 国防部(DND)希望通过无线网络连接几个北部前哨站.在建立网络时将使用两种不同的通信技术:每个前哨站都有一个无线电收发器,一些前哨站还有一个卫星信道.    任何带卫星频道的两个前哨站都可以通过卫星进行通信,无论其位置如何.否则,两个前哨只有当它们之间的距离不超过D时才可以通过无线电进行通信,这取决于收发器的功率.更高的功率产生更高的D但成本更高.由于采购

[kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads

给一个n个点的完全图 再给你m条道路已经修好 问你还需要修多长的路才能让所有村子互通 将给的m个点的路重新加权值为零的边到边集里 然后求最小生成树 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #define cl(a,b) memset(a

[kuangbin带你飞]专题六 最小生成树 J - Borg Maze

J - Borg Maze 题目链接:https://vjudge.net/contest/66965#problem/J 题目: 博格是一个非常强大的种族,它来自银河系的三角洲象限.博格集体是用来描述博格文明群体意识的术语.每个博格人都通过复杂的子空间网络与集体联系,确保每个成员得到持续的监督和指导. 你的任务是帮助博格(是的,真的)通过开发一个程序,帮助博格估计扫描迷宫的最低成本,以便同化隐藏在迷宫中的外星人,在北部,西部,东部和南部移动脚步.棘手的是,搜索的开始是由100多个人组成的.每当

[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)

K - The Unique MST 题目链接:https://vjudge.net/contest/66965#problem/K 题目: 给定连接的无向图,告诉它的最小生成树是否唯一. 定义1(生成树):考虑连通的无向图G =(V,E). G的生成树是G的子图,比如T =(V',E'),具有以下属性:    1. V'= V.    2.T是连接的和非循环的. 定义2(最小生成树):考虑边加权,连通,无向图G =(V,E). G的最小生成树T =(V,E')是总成本最小的生成树. T的总成本

[kuangbin带你飞]专题六 生成树

A. POJ 1679  The Unique MST 题意:最小生成树是不是唯一的. 思路:参考http://www.cnblogs.com/onlyAzha/p/4793031.html B. HDU 4081  Qin Shi Huang's National Road System 题意:秦始皇想要在城市之间修路.徐福可以用法力帮助他修一条路.秦始皇希望修一条路使得剩下的路需要的花费B最少,而徐福希望这条路所连的两个城市的人口数之和A最大.权衡后他们决定选择A/B的值最大的边来修建. 思

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher B - Oulipo HDU - 1686(kmp)

B - Oulipo HDU - 1686 题目链接:https://vjudge.net/contest/70325#problem/B 题目: The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pa

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher H - Seek the Name, Seek the Fame POJ - 2752(kmp的next数组应用)

H - Seek the Name, Seek the Fame POJ - 2752 题目链接:https://vjudge.net/contest/70325#problem/H 题目: The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. Th