HDU 1102

最小生成树水题
#include<bits/stdc++.h>

using namespace std;
#define inf 0x3f3f3f3f
#define M 105
int mat[M][M];
int prim(int n,int sta)//n表示有n个顶点,sta表从sta这个顶点出发生成最小生成树
{
    int mark[M],dis[M];
    int i,j,sum = 0,flag;     //sum是总的最小生成树边权值
    for (i = 0;i < n;i ++) //初始化dis[i] 表从顶点sta到点i的权值
    {
        dis[i] = mat[sta][i];
        mark[i] = 0;
    }
    mark[sta] = 1;           //sta 这个顶点加入最小生成树中
    for (i = 1;i < n;i ++)   //循环n-1次,每次找出一条最小权值的边 n个点的图
    {                        //只有n-1条边
        int min = inf;       //inf 表无穷大
        for (j = 0;j < n;j ++)//找出当前未在最小生成树中边权最小的顶点
            if (!mark[j] && dis[j] < min)
                min = dis[j],flag = j;
        mark[flag] = 1;         //把该顶点加入最小生成树中
        sum += dis[flag];       //sum加上其边权值
        for (j = 0;j < n;j ++)  //以flag为起点更新到各点是最小权值
            if (dis[j] > mat[flag][j])
                dis[j] = mat[flag][j];
    }
    return sum;       //返回边权总和
}

int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>mat[i][j];
            }
        }
        int k;
        cin>>k;
        for(int i=0;i<k;i++)
        {
            int a,b;
            cin>>a>>b;
            mat[a-1][b-1]=mat[b-1][a-1]=0;
        }
        cout<<prim(n,0)<<endl;
    }
    return 0;
}

posted @ 2018-04-28 00:55  MCQ  阅读(86)  评论(0编辑  收藏  举报