HDU 1102:Constructing Roads

来源:互联网 发布:java程序设计培训 编辑:程序博客网 时间:2024/06/13 07:08

最小生成树模板:


AC代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>#define eps 1e-6using namespace std;const int maxn = 110;const int INF = 1e9;int N;int Map[maxn][maxn];void initMap(){    for(int i = 1; i <= N ; i++)    {        Map[i][i] = 0;        for(int j = i+1; j <= N; j++)        {            Map[i][j] = Map[j][i] = INF;        }    }}int lowcost[maxn];int minCost;void prim(int s){    for(int i = 1; i <= N; i++)    {        lowcost[i] = Map[s][i];    }    lowcost[s] = -1;    int u;    int mst = 0;    for(int i = 1; i < N; i++)    {        minCost = INF;        u = 0;        for(int j = 1; j <= N; j++)        {            if(lowcost[j] != -1 && lowcost[j] < minCost)            {                minCost = lowcost[j];                u = j;            }        }        if(u == 0)            break;        lowcost[u] = -1;        mst += minCost;        for(int j = 1; j <= N; j++)        {            if(Map[u][j] < INF && Map[u][j]<lowcost[j])            {                lowcost[j] = Map[u][j];            }        }    }    printf("%d\n",mst);}int main(){    while(~scanf("%d",&N))    {        initMap();        for(int i = 1; i <= N; i++)        {            for(int j = 1; j <= N; j++)            {                scanf("%d",&Map[i][j]);            }        }        int Q,u,v;        scanf("%d",&Q);        while(Q--)        {            scanf("%d%d",&u,&v);            Map[u][v] = Map[v][u] = 0;        }        prim(1);    }    return 0;}


原创粉丝点击