杭电ACM1863(prim)

来源:互联网 发布:2016 mac pro强制重启 编辑:程序博客网 时间:2024/06/10 06:27

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
题目大意:中文题目
解题思路:简单的最小生成树,用prim算法解决,不同的是,本题要求若不能联通所有村庄则输出“?”,只要在prim函数里加一个判断即可,若visit数组全部为true则全部村庄都可联通,若存在一个位置为false则无法联通全部村庄,需要输出“?”。
AC代码:

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