Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
实在找不出来哪里错了,求大神指点#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=200000000; const int maxn=120; const int maxm=10010; int n,m; struct Point { double x,y; }p[maxn]; struct Edge { int u,v; double cost; }edge[maxm]; int pre[maxn],id[maxn],vis[maxn]; double in[maxn]; double zhuliu(int root,int n,int m) { int u,v; double res=0.0; while(1) { for(int i=1;i<=n;++i) in[i]=INF; for(int i=0;i<m;++i) if(edge[i].u!=edge[i].v&&edge[i].cost<in[edge[i].v]) { pre[edge[i].v]=edge[i].u; in[edge[i].v]=edge[i].cost; } for(int i=1;i<=n;++i) if(i!=root&&in[i]==INF) return -1;//不存在最小树形图 int tn=0; memset(id,-1,sizeof(id)); memset(vis,-1,sizeof(vis)); in[root]=0; for(int i=1;i<=n;++i) { res+=in[i]; v=i; while(vis[v]!=i&&id[v]==-1&&v!=root) { vis[v]=i; v=pre[v]; } if(v!=root&&id[v]==-1) { for(int u=pre[v];u!=v;u=pre[u]) id[u]=tn; id[v]=tn++; } } if(tn==0) break;//没有有向环 for(int i=1;i<=n;++i) if(id[i]==-1) id[i]=tn++; for(int i=0;i<m;) { v=edge[i].v; edge[i].u=id[edge[i].u]; edge[i].v=id[edge[i].v]; if(edge[i].u!=edge[i].v) edge[i++].cost-=in[v]; else swap(edge[i],edge[--m]); } n=tn; root=id[root]; } return res; } double Distance(int i,int j) { return sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)); } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;++i) scanf("%lf%lf",&p[i].x,&p[i].y); int a,b; for(int i=0;i<m;++i) { scanf("%d%d",&a,&b); edge[i].u=a; edge[i].v=b; if(edge[i].u!=edge[i].v) edge[i].cost=Distance(a,b); else edge[i].cost=INF; } double ans=zhuliu(1,n,m); if(ans==-1) printf("poor snoopy\n"); else printf("%.2f\n",ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator