Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:实在找不出来哪里错了,求大神指点

Posted by Commence at 2015-10-26 20:14:44 on Problem 3164
In Reply To:实在找不出来哪里错了,求大神指点 Posted by:yaoyueduzhen at 2015-10-08 22:21:51
> #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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator