【POJ 1258】 Agri-Net

来源:互联网 发布:干了这杯酒 歌词网络 编辑:程序博客网 时间:2024/06/06 00:47

【POJ 1258】 Agri-Net

最小生成树模板

Prim

#include#define INF 0x3f3f3f3fusing namespace std;int mp[501][501];int dis[501];bool vis[501];int n;int Prim(){    int i,j,w,p,sum = 0;    memset(dis,-1,sizeof(dis));    memset(vis,0,sizeof(vis));    dis[1] = 0;    for(i = 0; i < n; ++i)    {        w = INF;        for(j = 1; j <= n; ++j)        {            if(!vis[j] && dis[j] < w && dis[j] != -1)            {                p = j;                w = dis[j];            }        }        vis[p] = 1;        sum += w;        for(j = 1; j <= n; ++j)        {            if(!vis[j] && (dis[j] == -1 || dis[j] > mp[p][j]))                dis[j] = mp[p][j];        }    }    return sum;}int main(){    int i,j;    while(~scanf("%d",&n))    {        for(i = 1; i <= n; ++i)        {            for(j = 1; j <= n; ++j)            {                scanf("%d",&mp[i][j]);            }        }        printf("%d\n",Prim());    }    return 0;}

Kruskal

#includeusing namespace std;typedef struct Edge{    int u,v,w;    bool operator < (const struct Edge a)const    {        return w < a.w;    }}Edge;Edge eg[255555];int pre[555];int tp;void Init(int n){    int i;    for(i = 1; i <= n; ++i)        pre[i] = i;}int Find(int x){    if(x != pre[x]) pre[x] = Find(pre[x]);    return pre[x];}int main(){    int n,i,j,w,k,r,sum,cnt;    while(~scanf("%d",&n))    {        tp = 0;        Init(n);        for(i = 1; i <= n; ++i)        {            for(j = 1; j <= n; ++j)            {                scanf("%d",&w);                if(j > i)                {                    eg[tp].w = w;                    eg[tp].u = i;                    eg[tp++].v = j;                }            }        }        sort(eg,eg+tp);        sum = cnt = 0;        for(i = 0; i < tp; ++i)        {            k = Find(eg[i].u);            r = Find(eg[i].v);            if(k != r)            {                pre[k] = r;                sum += eg[i].w;                cnt++;            }            if(cnt == n-1) break;        }        printf("%d\n",sum);    }    return 0;}
0 0
原创粉丝点击