
将已经链接的边的权值设为0即可。
但是可能会超时,提交的时候,有一次显示超时,所以这个解法是有问题的,看到有171ms的,实力差的太大了,还是得使劲刷题。
/*2015-5-18 951ms*/
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f int map[510][510],p[510],n; int prime(){ int visit[510]; int less[510]; int nodes,sum; sum = 0;nodes = 1; memset(visit,0,sizeof(visit)); visit [1] = 1; for(int i = 1;i<=n;i++){ less[i] = map[1][i]; } int temp,k; for(int i = 1;i<=n;i++){ temp = INF; for(int j = 1;j<=n;j++){ if(!visit[j] && temp > less[j]) temp = less[k=j]; } if(temp == INF)break; nodes++; sum += less[k]; visit[k] = 1; for(int j = 1;j<=n;j++){ if(!visit[j] && less[j] > map[k][j]) less[j] = map[k][j]; } } // printf("%d\n",nodes); if(nodes == n)return sum; else return -1; } int main() { int t ; scanf("%d",&t); while(t--){ int m,k; memset(map,INF,sizeof(map)); scanf("%d%d%d",&n,&m,&k); for(int i = 0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b] = map[b][a] = min(map[a][b],c); } for(int i = 0;i<k;i++){ int d; scanf("%d",&d); int x[510]; for(int j =0;j<d;j++){ scanf("%d",&x[j]); } for(int j = 0;j<d-1;j++) for(int jj = j+1;jj<d;jj++) map[x[j]][x[jj]] = map[x[jj]][x[j]] = 0; } printf("%d\n",prime()); } }
1 /*这个代码还是比较给力的,这个是利用了Prime算法的特点,将连起来的点构成链,2015-5-18 717ms*/
2 #include<stdio.h>
3 #include<string.h>
4 #include<algorithm>
5 using namespace std;
6
7 #define INF 0x3f3f3f3f
8
9 int map[510][510],p[510],n;
10
11
12 int prime(){
13
14 int visit[510];
15 int less[510];
16
17 int nodes,sum;
18
19 sum = 0;nodes = 1;
20
21 memset(visit,0,sizeof(visit));
22
23 visit [1] = 1;
24
25 for(int i = 1;i<=n;i++){
26
27 less[i] = map[1][i];
28 }
29 int temp,k;
30 for(int i = 1;i<=n;i++){
31
32 temp = INF;
33 for(int j = 1;j<=n;j++){
34 if(!visit[j] && temp > less[j])
35 temp = less[k=j];
36 }
37 if(temp == INF)break;
38 nodes++;
39 sum += less[k];
40
41 visit[k] = 1;
42
43 for(int j = 1;j<=n;j++){
44 if(!visit[j] && less[j] > map[k][j])
45 less[j] = map[k][j];
46 }
47
48 }
49 // printf("%d\n",nodes);
50 if(nodes == n)return sum;
51 else return -1;
52
53 }
54
55
56 int main() {
57
58 int t ;
59
60 scanf("%d",&t);
61
62 while(t--){
63
64 int m,k;
65
66 memset(map,INF,sizeof(map));
67
68 scanf("%d%d%d",&n,&m,&k);
69
70 for(int i = 0;i<m;i++){
71
72 int a,b,c;
73
74 scanf("%d%d%d",&a,&b,&c);
75
76 map[a][b] = map[b][a] = min(map[a][b],c);
77
78 }
79 for(int i = 0;i<k;i++){
80 int d;
81
82 scanf("%d",&d);
83
84 int x,last;
85
86 scanf("%d",&last);
87 for(int j =2;j<=d;j++){
88
89 scanf("%d",&x);
90 map[x][last] = map[last][x] = 0;
91 last = x;
92 }
93
94 }
95 printf("%d\n",prime());
96
97 }
98
99
100
101 }