题意:给出几个村庄修路所花费的费用,现在再给出几组已经有路的村庄。输出这些村庄联通所要生成的最小费用。
处理:把已经存在的路更新为0就行了。初始化map数组时初始为-1即可。
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102
View Code
#include <iostream> #include <cmath> using namespace std; #define INF 0x3fffffff #define MAX 100+10 int map[MAX][MAX]; int used[MAX]; int dis[MAX]; int sum; int n; void Prim(int start) { memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { dis[i]=INF; } dis[start]=0; for(i=1;i<=n;i++) { double Min=INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&Min>dis[j])//找最小值 { Min=dis[j]; index=j; } } sum+=dis[index]; used[index]=1; for(j=1;j<=n;j++) { if(dis[j]>map[index][j]&&map[index][j]!=-1)//松弛 { dis[j]=map[index][j]; } } } return; } int main() { while(~scanf("%d",&n)) { memset(map,-1,sizeof(map));//初始化的时候初始为-1 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&map[i][j]); } } int k; scanf("%d",&k); while(k--) { int a; int b; scanf("%d%d",&a,&b);//将节点更新为0 map[a][b]=0; map[b][a]=0; } sum=0; Prim(1); printf("%d\n",sum); } return 0; }