zoj 1372 || poj 1287 Networking ( prim || kruskal ~)

和1406基本一样 不过用prim输入的时候 加了个判断,因为可能有重复的边,要最小的那条。kruskal写的还是不熟练!!

 

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

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #define N 55 using namespace std; struct node { int x,y; int len; }city[2600]; typedef struct node NODE; int n,m,pre[N]; int cmp(const void *a,const void *b) { return ((NODE*)a)->len > ((NODE*)b)->len ? 1 : -1; } void input() { int i,x,y,len; cin>>m; for(i=0; i<m; i++) { cin >> city[i].x >> city[i].y >> city[i].len; } } int find( int x ) { while( x!= pre[x] ) x = pre[x]; return x; } void kruskal() { int i,a,b,sum = 0; qsort(city,m,sizeof(NODE),cmp); for(i=1; i<=n; i++) pre[i] = i; for(i=0; i<m; 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) { while( cin>>n && n ) { input(); kruskal(); } return 0; }  

你可能感兴趣的:(struct,input,IM,networking)