杭电oj 1863 畅通工程 最小生成树问题 Prim版

    xiaoxiao2022-07-03  204

    杭电oj 1863 畅通工程 Prim版

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。

    Input 测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

    Output 对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

    Sample Input

    3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100

    Sample Output

    3 ?

    本题考察的是对最小生成树的理解,难度不大,是非常经典的一题. 如果对最小生成树不理解可以看看我的另一篇文章,最小生成树Prim版.

    解决代码

    #include<iostream> using namespace std; #define max 110 #define inf 1000000 int map[max][max];//地图 int dist[max]; int n,m;//m是顶点数 int prim() { int t=0;//权合 int c=0;//收录顶点数 for(int i=1;i<=m;i++)//初始化dist { dist[i]=map[1][i]; } dist[1]=0;//收录第一个 c++; while(1) { int min=inf;//设置最小值 int v=-1;//即将收录的那个顶点 for(int i=1;i<=m;i++)//寻找最小值 { if(dist[i]!=0&&dist[i]<min) { min=dist[i]; v=i; } } if(v==-1)//已经没有可以收录的点,结束 break; t+=dist[v];//权值相加 dist[v]=0; c++; for(int i=1;i<=m;i++)//更新dist { if(dist[i]!=0&&map[v][i]<dist[i]) { dist[i]=map[v][i]; } } } if(c<m)//资料不足 return 0; else return t;//返回权值合 } int main() { while(cin>>n>>m,n) { for(int i=1;i<=m;i++)//初始化 { for(int j=1;j<=m;j++) map[i][j]=inf; } int a,b,c; for(int i=1;i<=n;i++) { cin>>a>>b>>c; map[a][b]=c; map[b][a]=c; } int k=prim(); if(k) {cout<<k<<endl; }else {cout<<"?"<<endl; } } return 0; }
    最新回复(0)