编写最小生成树代码遇到的小问题

来源:互联网 发布:java 项目中使用log4j 编辑:程序博客网 时间:2024/06/04 19:05
#include<stdio.h>#include<string.h>#include<malloc.h>#include<algorithm>#define max 0x3f3f3f3f如果定义成0x7FFFFFFF答案也是错的
using namespace std;int map[200][200];int mark[200];int low[200];int n,m,a,b,c,sum,i,j;/*int prim(int pos){    int min;    mark[pos]=1;    for(i=1;i<=n;i++)    {        if(i!=pos)        low[i]=map[pos][i];    }    for(i=1;i<=n;i++)    {        min=max;        for(j=1;j<=n;j++)        {            if(low[j]<min&&mark[j]==0)            {                min=low[j];                pos=j;            }        }        sum=sum+min;        mark[pos]=1;        for(j=1;j<=n;j++)        {            if(map[pos][j]<low[j]&&mark[j]==0)            {                low[j]=map[pos][j];            }        }    }    return sum;}*/int prim(int start){    int pos,min;    mark[start]=1;    for(i=1;i<=n;i++)    {            low[i]=map[start][i];    }    for(i=1;i<n;i++)//一定要注意这里是循环n-1次        {        min=max;        for(j=1;j<=n;j++)        {            if(low[j]<min && mark[j]==0)            {                min=low[j];                pos=j;            }        }        sum+=min;        mark[pos]=1;        for(j=1;j<=n;j++)        {            if(map[pos][j]<low[j] && mark[j]==0)            {                low[j]=map[pos][j];            }        }    }    return sum;}int main(){    while(~scanf("%d%d",&n,&m))    {        sum=0;        memset(mark,0,sizeof(mark));        memset(map,max,sizeof(map));        memset(low,max,sizeof(low));        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            if(map[a][b]>c||map[b][a]>c)            {                map[a][b]=map[b][a]=c;            }        }        int ans=prim(1);        printf("%d\n",ans);    }}/**************************************Problem id: SDUT OJ I 


 

0 0