POJ 3625 Building Roads

    xiaoxiao2022-06-28  30

    Description Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms. Each of the N (1 ≤ N ≤ 1,000) farms (conveniently numbered 1..N) is represented by a position (Xi, Yi) on the plane (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000). Given the preexisting M roads (1 ≤ M ≤ 1,000) as pairs of connected farms, help Farmer John determine the smallest length of additional roads he must build to connect all his farms. Input * Line 1: Two space-separated integers: N and M * Lines 2..N+1: Two space-separated integers: Xi and Yi * Lines N+2..N+M+2: Two space-separated integers: i and j, indicating that there is already a road connecting the farm i and farm j. Output * Line 1: Smallest length of additional roads required to connect all farms, printed without rounding to two decimal places. Be sure to calculate distances as 64-bit floating point numbers. Sample Input 4 1 1 1 3 1 2 3 4 3 1 4 Sample Output 4.00


    这题与常规最小生成树一样。 然而是玄学题。。。 第一次交mle+wa,去网上找了一份交了,ac。 我不服。 改了在交re。 出了变量名都一样啊。 多交了几次,就迷之ac了。 玄不救非,珍爱生命,远离p站。


    #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn=1001; int n,m,tp,f[maxn]; double ans; struct node { int x,y; double val; }a[maxn*maxn]; struct fm { double xx,yy; }p[maxn]; double dis(fm a, fm b) { return sqrt((a.xx - b.xx)*(a.xx - b.xx) + (a.yy - b.yy) * (a.yy - b.yy)); } bool cmp(node c,node d) { return c.val<d.val; } int fnd(int x) { if(f[x]!=x) f[x]=fnd(f[x]); return f[x]; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].xx,&p[i].yy); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { ++tp; a[tp].x=i; a[tp].y=j; a[tp].val=dis(p[i],p[j]); } int t1,t2; while(m--) { scanf("%d%d",&t1,&t2); f[fnd(t1)]=fnd(t2); } sort(a+1,a+tp+1,cmp); for(int i=1;i<=tp;i++) if(fnd(a[i].x)!=fnd(a[i].y)) { f[fnd(a[i].y)]=fnd(a[i].x); ans+=a[i].val; } printf("%.2f\n",ans); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1124459.html

    最新回复(0)