这道题目和POJ有一道题目一样哎,但是内容不一样。。
这道题其实也挺水的,如果再加个字典序的话就纠结点,可惜没有而且还是special judge~
开始一直WA,看了党的才知道,我开始判断不加入集合的有点错,我以为不加到节点中就可以在下面的过程中不判断已经有高速的路了,WA证明我这点是错滴。。。因为kruskal算法是判断与它在一个集合里的点。。。等等等等。。。不加入的话,在PRE数组中体现不出来它们已经在集合里了。。。说得挺纠结的吧 呵呵~
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <math.h> #include <memory.h> #define N 755 using namespace std; int n,p = 0; int pre[N]; struct edge { int x,y; double len; }city[N*N]; typedef struct edge NODE; double compute(double x1,double y1,double x2,double y2) { return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2); } int find(int x) { while(x!=pre[x]) x = pre[x]; return x; } void input() { int m,x,y; p = 0; double coor[N][2],len; cin >> n; for(int i=1; i<=n; i++) cin >> coor[i][0] >> coor[i][1]; cin >> m; for(int i=1; i<=n; i++) pre[i] = i; for(int i=1; i<=m; i++) { cin >> x >> y; x = find(x); y = find(y); if( x!= y ) pre[x] = y; } for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) { len = compute(coor[i][0],coor[i][1],coor[j][0],coor[j][1]); city[p].x = i; city[p].y = j; city[p].len = len; p++; } } int cmp ( const void *a, const void *b) { return ((NODE*)a)->len > ((NODE*)b)->len ? 1 : -1; } void kruskal() { int a,b,i; qsort( city , p, sizeof(NODE),cmp); for(i=0; i<p; i++) { a = find( city[i].x ); b = find( city[i].y ); if( a!= b ) { pre[b] = a; cout << city[i].x << " " << city[i].y << endl; } } } int main(void) { int ncases; cin >> ncases; while( ncases-- ) { input(); kruskal(); if( ncases != 0 ) cout << endl; } return 0; }