uva 10397【Connect the Campus】
2012-04-16 13:02
295 查看
Krustral 变形。。。。。。
代码如下:
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> struct distance { int u,v; double w; }d[1000000]; struct point { int x,y; }p[1000]; int f[1000]; int n; int num; bool cmp(const distance& a,const distance& b) { if(a.w == b.w) return a.u < b.u; return a.w < b.w; } double dis(point a,point b) { return sqrt(1.0*(a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y)); } int find(int x) { if(x == f[x]) return x; f[x] = find(f[x]); return f[x]; } void Krustral() { double sum = 0; int k = 0; for(int i = 0;i < num;i ++) { int fa = find(d[i].u); int fb = find(d[i].v); if(fa != fb) { f[fa] = fb; sum += d[i].w; k ++; } if(k == n -1) break; } printf("%.2lf\n",sum); } int main() { while(scanf("%d",&n) == 1) { num = 0; for(int i = 1;i <= n;i ++) { scanf("%d%d",&p[i].x,&p[i].y); for(int j = 1;j < i;j ++) { d[num].u = i; d[num].v = j; d[num ++].w = dis(p[i],p[j]); } } std::sort(d,d + num,cmp); for(int i = 0;i <= n;i ++) { f[i] =i; } int on; scanf("%d",&on); for(int i = 0;i < on;i ++) { int a,b; scanf("%d%d",&a,&b); f[find(a)] = find(b); } Krustral(); } return 0; }
相关文章推荐
- UVa:10397 Connect the Campus(最小生成树)
- UVA 10397 - Connect the Campus(最小生成树)
- uva 10397 Connect the Campus
- UVA_10397_Connect the Campus
- UVa 10397 Connect the Campus
- uva 10397 Connect the Campus(最小生成树kruskal)
- UVa 10397 - Connect the Campus
- uva 10397 - Connect the Campus(最小生成树&并查集)
- uva 10397 Connect the Campus kruskal 算法变形
- UVA - 10397 Connect the Campus (最小生成树)
- uva 10397 Connect the Campus(kruskal并查集)
- UVA 10397 Connect the Campus
- uva_10397 Connect the Campus
- Uva - 10397 - Connect the Campus
- UVa 10397 Connect the Campus (Kruskal+补全最小生成树)
- UVa 10397 - Connect the Campus
- uva 10397 Connect the Campus kruskal || prim
- Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)
- UVA 10397 Connect the Campus
- UVa 10397 - Connect the Campus