HDU-1233 还是畅通工程(最小生成树Prim算法)

来源:互联网 发布:idea创建web项目ubuntu 编辑:程序博客网 时间:2024/04/26 01:24

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 48819    Accepted Submission(s): 22279


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
 

Sample Output
35

思路:简单的Prim算法,模板题

#include<iostream>#define maxn 110using namespace std;const int INF=0x3f3f3f3f;int graph[maxn][maxn];int prim(int graph[][maxn], int n)  {      int lowcost[maxn];      int mst[maxn];      int i, j, min, minid, sum = 0;      for (i = 2; i <= n; i++)      {          lowcost[i] = graph[1][i];          mst[i] = 1;      }      mst[1] = 0;      for (i = 2; i <= n; i++)      {          min = INF;          minid = 0;          for (j = 2; j <= n; j++)          {              if (lowcost[j] < min && lowcost[j] != 0)              {                  min = lowcost[j];                  minid = j;              }          }          sum += min;          lowcost[minid] = 0;          for (j = 2; j <= n; j++)          {              if (graph[minid][j] < lowcost[j])              {                  lowcost[j] = graph[minid][j];                  mst[j] = minid;              }          }      }      return sum;  }int main(void){    int n,m,i,j,k,cost;    while(cin>>n&&n)    {        for(i=1;i<maxn;i++)            for(j=1;j<maxn;j++)                graph[i][j]=INF;        for(k=0;k<n*(n-1)/2;k++)        {            cin>>i>>j>>cost;            graph[i][j]=graph[j][i]=cost;        }        int ans=prim(graph,n);        cout<<ans<<endl;            }}




阅读全文
0 0
原创粉丝点击