poj 1258 Agri-Net

一直RE 一直RE。。
果断舍弃prim了。。

然后kruskal开了很大的数组。。orz。。。

然后prim 换了种写法, 居然0ms过了。。

prim

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int way[110][110];
int city[110];
int vis[110];
struct sb
{
    int s;
    int e;
    int v;
    bool operator<(const sb&wakaka)const
    {
        return v>wakaka.v;
    }
}test,test2;
//priority_queue<sb>q;
int main()
{
    int n;
    memset(city,0,sizeof(city));
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&way[i][j]);
            }
        long long ans=0;
        for(int i=1;i<=n;i++)
        {
            city[i]=0x3f3f3f3f;
            vis[i]=0;
        }
        for(int i=1;i<=n;i++)
        {
            int min1=0x3f3f3f3f;
            int v=1;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]&&city[j]<min1)
                {
                    min1=city[j];
                    v=j;
                }
            }
            vis[v]=1;
            if(min1<0x3f3f3f3f)
                ans=ans+min1;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j])
                    city[j]=min(city[j],way[v][j]);
            }
        }

        cout<<ans<<endl;
    }
    return 0;
}

kruskal

#include<stdio.h>
#include<algorithm>
using namespace std;
struct sb
{
    int a,b;
    int money;
    bool operator<(const sb&wakaka)const
    {
        return money<wakaka.money;
    }
}city[100000];
int flag[100000];
int find(int c)
{
    int t=c;
    while(t!=flag[t])
        t=flag[t];
    int x=c,i;
    while(flag[x]!=t)
    {
       i=flag[x];
       flag[x]=t;
       x=i;
    }
    return t;
}
void marry(int c1,int c2)
{
    if(c1>c2)
        flag[c1]=c2;
    else
        flag[c2]=c1;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int cnt=0;
        int i,j;
        int way;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                {
                    scanf("%d",&way);
                    if(i<j)
                    {
                        city[++cnt].a=i;
                        city[cnt].b=j;
                        city[cnt].money=way;
                    }
                }
        for(i=1;i<=n;i++)
            flag[i]=i;
        sort(city+1,city+1+cnt);
        int ans=0;
        for(i=1;i<=cnt;i++)
        {
            int x1=find(city[i].a);
            int x2=find(city[i].b);
            if(x1!=x2)
            {
                marry(x1,x2);
                ans=ans+city[i].money;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(最小生成树,poj)