| ||||||||||
| 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