中文题
按照长度排序,然后并查集即可。
#include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int fa[100005]; int n; double ans, S; struct edge{ int x, y; double l; }E[100005]; int findfa(int x){ if(fa[x] != x){ fa[x] = findfa(fa[x]); } return fa[x]; } void add(int x, int y, double k){ if(x > y) swap(x, y); x = findfa(x); y = findfa(y); if(x != y){ fa[y] = x; ans += k; } } bool cmp(edge a, edge b){ return a.l < b.l; } int main(){ //freopen("a.txt", "r", stdin); int m = 1; scanf("%lf %d", &S, &n); while(scanf("%d %d %lf", &E[m].x, &E[m].y, &E[m].l) != EOF){ m++; }m--; for(int i = 1; i <= n; i++) fa[i] = i; sort(E+1, E+m+1, cmp); ans = 0; for(int i = 1; i <= m; i++){ add(E[i].x, E[i].y, E[i].l); } bool flag = 0; int x = findfa(1); for(int i = 2; i <= n; i++){ if(findfa(i) != x){ flag = 1; break; } } if(ans-S > 1e-6 || flag) cout << "Impossible" << endl; else printf("Need %.2f miles of cablen", ans); return 0; }