题意:有n个人,每个人都有自己喜欢用的网络适配器,要你求连接所有人的最小费用
构图的时候每条边的权值等于 两个人用的适配器的费用加上两个人之间网线的费用,然后求最小生成树
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 #define inf 9999999 8 #define N 1005 9 int n,g[N][N],vis[N],dis[N]; 10 int cos[N]; 11 12 int prim(int st) 13 { 14 for(int i=1; i<=n; i++) 15 { 16 dis[i] = g[i][st]; 17 vis[i] = 0; 18 } 19 dis[st] = 0 ; vis[st] = 1; 20 int cost = 0; 21 for(int T=1; T<n; T++) 22 { 23 int mindis = inf , idx = -1; 24 for(int i=1; i<=n; i++) 25 { 26 if(!vis[i]&&dis[i] < mindis) 27 { 28 mindis = dis[i]; 29 idx = i; 30 } 31 } 32 cost += mindis; 33 if(idx == -1) return -1; 34 vis[idx] = 1; 35 for(int i=1; i<=n; i++) 36 { 37 if(!vis[i]&& dis[i]>g[i][idx]) 38 { 39 dis[i] = g[i][idx]; 40 } 41 } 42 } 43 return cost; 44 } 45 46 int main() 47 { 48 int T,val; 49 scanf("%d",&T); 50 while(T--) 51 { 52 for(int i=1; i<=n; i++) 53 for(int j=1; j<=n; j++) 54 { 55 if(i==j) g[i][j] =0; 56 else g[i][j]= inf; 57 } 58 59 scanf("%d",&n); 60 for(int i=1; i<=n; i++) 61 scanf("%d",&cos[i]); 62 for(int i=1; i<=n; i++) 63 for(int j=1; j<=n; j++) 64 { 65 scanf("%d",&val); 66 if(i!=j) g[i][j] = val + cos[i] + cos[j]; 67 } 68 printf("%d\n",prim(1)); 69 } 70 return 0; 71 }
View Code
转载于:https://www.cnblogs.com/ar940507/p/3224190.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110063.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...