题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3371

 

题目不难 稍微注意一下 要把已经建好的城市之间的花费定义为0,在用普通Prim算法就可以了;我没有用克鲁斯卡尔算法(Kruskal's algorithm),因为这题数据比较大,而且要处理大量的数据使它为0,怕超时T^T。。。。。

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 #define inf 999999
 8 
 9 int map[505][505],node[505],n,vis[505];
10 int dd[505],sum;
11 
12 int Prim()
13 {
14     int tm=1;
15     node[tm]=0;
16     //vis[tm]=1;
17     for(int k=1;k<=n;k++)
18     {
19         int minn=inf;
20         for(int i=1;i<=n;i++)
21         if(!vis[i]&&minn>node[i])
22         {
23             tm=i;
24             minn=node[i];
25         }
26         vis[tm]=1;
27         if(minn==inf)
28         return 0;
29 
30         sum+=minn;
31 
32         for(int i=1;i<=n;i++)
33         {
34             if(!vis[i]&&node[i]>map[tm][i])
35             node[i]=map[tm][i];
36         }
37     }
38     return 1;
39 }
40 
41 int main()
42 {
43     int T;
44     scanf("%d",&T);
45     while(T--)
46     {
47         int m,k;
48         scanf("%d%d%d",&n,&m,&k);
49         for(int i=1;i<=n;i++)
50         {
51             node[i]=inf;vis[i]=0;
52             for(int j=1;j<=n;j++)
53             map[i][j]=inf;
54         }
55         while(m--)
56         {
57             int a,b,d;
58             scanf("%d%d%d",&a,&b,&d);
59             if(map[a][b]>d)
60             map[a][b]=map[b][a]=d;
61         }
62         while(k--)
63         {
64             int t;
65             scanf("%d",&t);
66             for(int i=1;i<=t;i++)
67             {
68                 scanf("%d",&dd[i]);
69             }
70             for(int i=1;i<=t;i++)
71             {
72                 for(int j=i+1;j<=t;j++)
73                 map[dd[i]][dd[j]]=map[dd[j]][dd[i]]=0;
74             }
75         }
76         sum=0;
77         int flag=Prim();
78         if(flag==0)
79         printf("-1\n");
80         else
81         printf("%d\n",sum);
82     }
83     return 0;
84 }

 

posted on 2014-08-27 19:44  Mis_xiao  阅读(156)  评论(0编辑  收藏  举报