杭电ACM1233(prim)

来源:互联网 发布:网络人旗舰版 编辑:程序博客网 时间:2024/06/05 09:25

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233
题目大意:中文题目
解题思路:简单的最小生成树问题,可以用Kruskal或者prim算法解决,这里用prim算法。
AC代码:

#include <iostream>#include <string.h>using namespace std;#define INF 2000000int prim(int matrix[105][105],int n){    bool visited[105];    int result=0;    int p[n];    for(int i=1;i<=n;i++)    {        p[i] = matrix[1][i];    }    memset(visited,0,sizeof(visited));    for(int i=1;i<=n;i++)    {        int min = INF;        int index=0;        for(int j=1;j<=n;j++)        {            if(p[j]<min&&visited[j]==0)            {                min = p[j];                index = j;            }           }        visited[index] = 1;        result+=p[index];        for(int j=1;j<=n;j++)        {            if(!visited[j])p[j] = matrix[index][j]<p[j]?matrix[index][j]:p[j];        }    }    return result;}int main(){    int n;    int count;    int a,b,c;    int matrix[105][105];    while(cin>>n)    {        if(n==0)break;        count=(n-1)*n/2;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                matrix[i][j] = INF;                if(i==j)matrix[i][j] = 0;            }        }        for(int i=1;i<=count;i++)        {            cin>>a>>b>>c;            matrix[a][b] = matrix[b][a] = c;        }        if(n==1)cout<<0<<endl;        else cout<<prim(matrix,n)<<endl;    }    return 0;}
0 0
原创粉丝点击