hdu 1863(prim&kruskal)

来源:互联网 发布:c语言迷宫最短路径 编辑:程序博客网 时间:2024/05/17 23:23

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863

prim:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define INF 0x3fffffffint graph[101][101];int visit[101];int flag[101];int sum;int n,m;void prim(){    sum=0;    int pox,i,mix;    visit[1]=1;    for(i=1;i<=m;++i)        flag[i] = graph[1][i];    int p = m-1;    while(p--)    {        mix=INF;        for(i=1;i<=m;++i)        {            if(mix>flag[i] && !visit[i])            {                mix = flag[i];                pox = i;            }        }      //  printf("pox = %d\n",pox);        if(mix == INF)        {            printf("?\n");            return;        }        sum += mix;        visit[pox] = 1;        for(i=1;i<=m;++i)        {            if(flag[i]>graph[pox][i] && !visit[i])            {                flag[i] = graph[pox][i];            }        }    }    printf("%d\n",sum);}int main(){    int i,j;    while(~scanf("%d%d",&n,&m))    {        if(n==0)            break;        memset(visit,0,sizeof(visit));        memset(flag,0,sizeof(flag));        for(i=1; i<=m; ++i)        {            for(j=1;j<=m;++j)            {                if(i==j)                    graph[i][j] = 0;                else                    graph[i][j] = INF;            }        }        int a,b,c;        for(i=1; i<=n; ++i)        {            scanf("%d%d%d",&a,&b,&c);            graph[a][b] = c;            graph[b][a] = c;        }        prim();    }    return 0;}


kruskal:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int n,m,sum,cnt;struct edge{    int a;    int b;    int w;}M[5000];int father[110];int cmp(edge a, edge b){   return a.w < b.w;}void init(){    int i;    for(i=1;i<=m;++i)    {        father[i] = i;    }}int findFather(int x){    return father[x]==x?x:findFather(father[x]);}void kruskal(){    int i;    int x;    int y;    for(i=1;i<=n;i++)    {        x = findFather(M[i].a);        y = findFather(M[i].b);        if(x!=y)        {            father[M[i].a] = father[M[i].b];            ++cnt;            sum+= M[i].w;        }        if(cnt==m)        {            printf("%d\n",sum);            return ;        }    }    printf("?\n");}int main(){    int i;    while(~scanf("%d%d",&n,&m))    {        if(n==0)            break;        cnt=1;        sum=0;        for(i=1;i<=n;++i)        {            scanf("%d%d%d",&M[i].a,&M[i].b,&M[i].w);        }        init();        sort(M+1,M+1+n,cmp);        kruskal();    }    return 0;}


0 0
原创粉丝点击