HDU1102 Constructing Roads

来源:互联网 发布:java finalize 编辑:程序博客网 时间:2024/06/05 05:46

题意大致是:

有N多村子,村庄之间的距离已经给出。求联通各个村庄的最短路径。

有一个附加条件,期中一些村庄已经有公路村庄,即已经连通。

 

非常简单, 只要把已经连通的村庄之间的距离设置为0,然后用Prim算法套用模板直接计算即可。

#include<iostream>#include<math.h>using namespace std;#define MAXN 110#define INF 0x3fffffdouble map[MAXN][MAXN];double dis[MAXN];//存放现阶段到此点最断的里程;bool visited[MAXN];double Prim(int n) {visited[0] = true;double min_dis = 0;dis[0] = 0;for (int i=1; i<n; i++) {visited[i] = false;dis[i] = map[0][i];}for (int i=1; i<n; i++) {//N个点有N-1条边,故从1开始循环double temp_dis = INF;int dis_index = 0;for (int j=0; j<n; j++) {//寻找从j点出发那条路径最短;if (!visited[j] && temp_dis > dis[j]) {temp_dis = dis[j];dis_index = j;}}visited[dis_index] = true;min_dis += temp_dis;for (int k=0; k<n; k++) {//更新dis[];if (!visited[k] && map[k][dis_index] < dis[k]) {dis[k] = map[k][dis_index];}}}return min_dis;}int main() {int n;while (cin>>n) {for (int i=0; i<n; i++) {for (int j=0;j<n;j++) {cin >> map[i][j];}}int m;cin>>m;//已经建成公路的村庄之间的路径设置为0;for (int i=0; i < m; i++) {int a, b;cin>>a>>b;map[a-1][b-1] = 0;map[b-1][a-1] = 0;}cout<<Prim(n)<<endl;}}