最小树形图,,不熟练啊,写错几个地方无限TLE
#include<stdio.h> #include<string.h> #include<math.h> #define N 101 #define inf 0x3fffffff int flag[N],id[N],pre[N],n,m; double ms[N]; struct op { int x,y; double w; }e[N*N]; struct tp { double x,y; }p[N]; double dis(struct tp a,struct tp b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double liuzhu(int root) { int i,j,nm=n+1; double sum=0; while(1) { memset(flag,-1,sizeof(flag)); memset(id,-1,sizeof(id)); memset(pre,-1,sizeof(pre)); for(i=1;i<nm;i++) ms[i]=inf; for(i=0;i<m;i++) { int x=e[i].x,y=e[i].y; double w=e[i].w; if(y!=x&&ms[y]>w) { ms[y]=w; pre[y]=x; } } ms[root]=0;pre[root]=root; for(i=1;i<nm;i++) { if(ms[i]==inf)return -1.0; sum+=ms[i]; } int res=1; for(i=1;i<nm;i++) { if(flag[i]==-1) { int u=i; while(flag[u]==-1) { flag[u]=i; u=pre[u]; } if(u==root||flag[u]!=i)continue; for(int t=pre[u];t!=u;t=pre[t]) id[t]=res; id[u]=res++; } } if(res==1)break; for(i=1;i<nm;i++) if(id[i]==-1)id[i]=res++; for(i=0;i<m;i++) { e[i].w-=ms[e[i].y]; e[i].x=id[e[i].x]; e[i].y=id[e[i].y]; } root=id[root]; nm=res; } return sum; } int main() { int i,x,a,b,j; double sum; while(scanf("%d%d",&n,&m)!=-1) { for(i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); e[i].x=a; e[i].y=b; e[i].w=dis(p[a],p[b]); } sum=liuzhu(1); if(sum<0)printf("poor snoopy\n"); else printf("%.2f\n",sum); } return 0; }