poj 1258 Agri-Net

来源:互联网 发布:淘宝客点击要钱吗 编辑:程序博客网 时间:2024/06/17 06:11

一直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;}
0 0