intmain(){ cin >> n >> m; for (int i =1; i <= n; i ++ ) fa[i] = i; for (int i =1; i<= m;i ++) { int u,v,w; cin >> u >> v >> w; edge[i] = {u,v,w}; } sort(edge+1, edge+1+m);//按找边权从小到大排序 for (int i =1; i <= m; i ++ ) { int x = find(edge[i].x ) , y = find(edge[i].y); if (x == y) continue;//如果两个点属于同一集合就跳过 fa[x] = y;//合并两个集合 ans += edge[i].z;//将符合条件的边权累加到答案中 } cout << ans << endl; }
booloperator <(rec a, rec b) { return a.z < b.z; }
intmain(){int res = 0; cin >> n >> m; for (int i = 1; i <= n * m; i ++ ) fa[i] = i; int x1,y1,x2,y2; while (cin >> x1 >> y1 >> x2 >> y2) {//读入初始边并合并所连的点 int x = ask(x1,y1), y = ask(x2,y2); x = find(x), y =find(y); fa[x] = y; } int tot = 0;
for (int i = 1; i <= n; i ++ ) //建横向边 for (int j =1; j < m; j ++) { int x, y; x = ask(i,j), y =ask(i,j+1); edge[++tot].x = x,edge[tot].y = y; edge[tot].z = 2; } for (int i = 1; i <= m; i ++ ) //建纵向边 for (int j = 1; j < n; j ++ ) { int x ,y; x = ask(j,i), y = ask(j + 1,i); edge[++tot].x = x,edge[tot].y = y; edge[tot].z = 1; } sort(edge+1,edge+1+tot); for (int i =1; i <= tot; i ++ ) { int x = find(edge[i].x), y = find(edge[i].y); if (x == y) continue; fa[x] = y; res += edge[i].z; } cout << res << endl; }
bool v[N]; voidprim(){ memset(d,0x3f,sizeof d); memset(v,0,sizeof v); d[0] = 0; for (int i = 0; i < n; i ++ ) { int x = -1;//如果虚拟源点设为0,这里的x不能设置为0 for (int j = 0; j <= n; j++ ) if (!v[j] && ( x == -1 || d[j] < d[x])) x = j; v[x] = 1; for (int j = 0; j <= n; j ++ ) if(!v[j]) d[j] = min(d[j],a[x][j]); } }
intmain(){ cin >> n; memset(a,0x3f,sizeof a); for (int i = 1; i <= n; i ++ ) { int x; cin >> x; a[0][i] = a[i][0] = x; } for (int i = 0; i <= n; i ++ ) a[i][i] = 0; for (int i = 1; i <= n; i++) for (int j =1; j <= n; j ++ ) cin>>a[i][j]; prim(); for (int i = 0; i <= n; i ++ ) if (d[i] != 0x3f3f3f3f) ans += d[i]; cout << ans << endl; }
intmain(){ while(cin >> n,n) { memset(edge,0,sizeof edge); tot = 0; memset(q,'\0',sizeof q); for (int i = 0; i < n; i ++ ) { scanf("%s",q[i]); } for (int i = 0; i< n ;i ++ ) { for (int j = i + 1; j < n; j ++ ) { int cnt = 0; for (int k = 0; k < 7; k ++ ) if (q[i][k] != q[j][k]) cnt++; edge[++tot].x = i + 1,edge[tot].y = j + 1, edge[tot].d = cnt; } } for (int i = 1;i <= tot; i ++ )fa[i] = i; sort(edge+1,edge+1+tot); int ans = 0; for (int i = 1; i <= tot; i ++) { int x = find(edge[i].x), y = find(edge[i].y); if (x == y ) continue; fa[x] = y; ans += edge[i].d; } printf("The highest possible quality is 1/%d.\n",ans); } }