ZOJ1586

题意:有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
",prim(1));
69     }
70     return 0;
71 }
View Code
原文地址:https://www.cnblogs.com/ar940507/p/3224190.html