SDUT 3362 数据结构实验之图论六:村村通公路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUT 3362 数据结构实验之图论六:村村通公路相关的知识,希望对你有一定的参考价值。
数据结构实验之图论六:村村通公路
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。
Input
连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。
Output
输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。
Example Input
5 8 1 2 12 1 3 9 1 4 11 1 5 3 2 3 6 2 4 9 3 4 4 4 5 6
Example Output
19
DQE:
最小生成树问题,学会使用countw数组连接下一个顶点,配合深度优先搜索判断公路是否连通
1 #include <iostream> 2 #include <cstdio> 3 #include <climits> //INT_MAX 4 5 using namespace std; 6 7 #define MVN 101 8 9 typedef struct AdjMatrix 10 { 11 int w; 12 char *info; 13 }AM; 14 15 typedef struct MGraph 16 { 17 int vex[MVN]; 18 AM arc[MVN][MVN]; 19 int vexnum,arcnum; 20 }MG; 21 22 struct ue 23 { 24 int pr; 25 int w; 26 }countw[MVN],mi; 27 28 void creat(MG &G) 29 { 30 int i,j,w,k; 31 for(k=1;k<=G.vexnum;k++) 32 G.vex[k]=k; 33 for(k=1;k<=G.arcnum;k++) 34 { 35 scanf("%d %d %d",&i,&j,&w); 36 G.arc[i][j].w=w; 37 G.arc[j][i].w=w; 38 } 39 } 40 41 int count,sum; 42 void DFS(MG &G,bool *visited,int i) 43 { 44 count++; 45 visited[i]=true; 46 int k; 47 mi.w=INT_MAX; 48 mi.pr=0; 49 for(k=1;k<=G.vexnum;k++) 50 { 51 if(countw[k].w<mi.w && visited[k]==false) 52 { 53 mi.pr=k; 54 mi.w=countw[k].w; 55 } 56 } 57 if(mi.pr!=0) 58 { 59 for(k=1;k<=G.vexnum;k++) 60 { 61 if(countw[k].w>G.arc[k][mi.pr].w) 62 { 63 countw[k].pr=mi.pr; 64 countw[k].w=G.arc[k][mi.pr].w; 65 } 66 }//更新countw 67 sum+=G.arc[countw[mi.pr].pr][mi.pr].w; 68 DFS(G,visited,mi.pr); 69 } 70 } 71 72 int main() 73 { 74 MG G; 75 while(scanf("%d %d",&G.vexnum,&G.arcnum)!=EOF) 76 { 77 int k,o; 78 for(k=1;k<=G.vexnum;k++) 79 { 80 for(o=1;o<=G.vexnum;o++) 81 { 82 G.arc[k][o].w=INT_MAX; 83 } 84 }//邻接矩阵初始化 85 creat(G); 86 bool visited[MVN]={false}; 87 for(k=1;k<=G.vexnum;k++) 88 { 89 if(G.arc[1][k].w<INT_MAX) 90 { 91 countw[k].pr=1; 92 countw[k].w=G.arc[1][k].w; 93 } 94 else 95 countw[k].w=INT_MAX; 96 } 97 count=0; 98 sum=0; 99 DFS(G,visited,1); 100 if(count==G.vexnum) 101 printf("%d\n",sum); 102 else 103 printf("-1\n"); 104 } 105 return 0; 106 } 107 108 /*************************************************** 109 User name: *** 110 Result: Accepted 111 Take time: 0ms 112 Take Memory: 172KB 113 Submit time: 2016-11-09 21:00:48 114 ****************************************************/
以上是关于SDUT 3362 数据结构实验之图论六:村村通公路的主要内容,如果未能解决你的问题,请参考以下文章
SDUT 2498 数据结构实验之图论十一:AOE网上的关键路径