zoj 2966 Build The Electric System ( prim || kruskal~ )

做的这几道基本都是一样的。。。。

 

prim纠结死了,SE了好多次。。。后来发现是要在赋值的时候 map[x][y] = map[y][x] = len; 原来忘了把两条路都弄上,只弄了一个。。。

 

kruskal很顺当。。。我应该学学党那种优先队列的方法了。。。

 

PRIM

#include <stdio.h> #include <stdlib.h> #include <iostream> #define N 510 using namespace std; int map[N][N],hash[N],dis[N],start,n,e; void input() { int i,j,x,y,len; cin >> n >> e; for(i=0; i<n; i++) { for(j=0; j<n; j++) map[i][j] = INT_MAX; } for(i=0; i<e; i++) { cin >> x >> y >> len; map[x][y] = map[y][x] = len; } } void prim() { int i,j,min,sum,now; for(i=1; i<=n; i++) { dis[i] = INT_MAX; hash[i] = 0; } now = 0; dis[now] = 0; hash[now] = 1; for(j=1; j<=n; j++) { for(i=0; i<n; i++) if( !hash[i] && map[now][i] < dis[i] ) dis[i] = map[now][i]; min = INT_MAX; for(i=0; i<n; i++) if(!hash[i] && dis[i] < min ) min = dis[now = i]; hash[now] = 1; } sum = 0; for(i=0; i<n; i++) sum += dis[i]; cout << sum << endl; } int main(void) { int ncases; cin >> ncases; while( ncases-- ) { input(); prim(); } return 0; }  

 

kruskal

#include <stdio.h> #include <stdlib.h> #include <iostream> #define N 510 using namespace std; int n,p,pre[N],e; struct C { int x,y,len; }city[N * (N - 1) / 2]; typedef struct C NODE; void input() { int i; cin >> n >> e; for(i=0; i<e; i++) { cin >> city[i].x >> city[i].y >> city[i].len; } } int cmp(const void *a,const void *b) { return ((NODE*)a)->len > ((NODE*)b)->len ? 1 : -1; } int find(int x) { while(x!=pre[x]) x = pre[x]; return x; } void kruskal() { int i,sum = 0,a,b; qsort( city, e, sizeof(NODE), cmp); for(i=0; i<n; i++) pre[i] = i; for(i=0; i<e; i++) { a = find( city[i].x ); b = find( city[i].y ); if( a!= b ) { sum += city[i].len; pre[b] = a; } } cout << sum << endl; } int main(void) { int ncases; cin >> ncases; while( ncases-- ) { input(); kruskal(); } return 0; }  

 

你可能感兴趣的:(zoj 2966 Build The Electric System ( prim || kruskal~ ))