您的位置:首页 > 其它

Command Network POJ - 3164 + Ice_cream’s world II HDU - 2121

2018-03-27 14:43 435 查看
点击打开链接(有根)

点击打开链接(无根)

算法讲解 点击打开链接

存模板#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000000000.0

struct node1
{
double x;
double y;
};

struct node2
{
int u;
int v;
double w;
};

node1 point[110];
node2 edge[10010];
double minn[110];
int pre[110],belong[110],vis[110];
int n,m;

double getdis(int u,int v)
{
return sqrt((point[v].x-point[u].x)*(point[v].x-point[u].x)+(point[v].y-point[u].y)*(point[v].y-point[u].y));
}

double solve(int root)
{
double w,ans;
int i,u,v,cnt,num;
ans=0.0;
while(1)
{
for(i=1;i<=n;i++)
{
minn[i]=N;
}
memset(pre,-1,sizeof(pre));
for(i=1;i<=m;i++)
{
u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(u!=v&&w<minn[v])
{
minn[v]=w;
pre[v]=u;
}
}
minn[root]=0;
pre[root]=-1;
num=0;
for(i=1;i<=n;i++)
{
if(pre[i]==-1&&i!=root) num++;
else ans+=minn[i];
}
if(num!=0) return -1.0;
memset(belong,0,sizeof(belong));
memset(vis,0,sizeof(vis));
cnt=0;
for(i=1;i<=n;i++)
{
if(belong[i])continue;
u=i;
while(u!=-1&&!belong[u]&&vis[u]!=i)
{
vis[u]=i;
u=pre[u];
}
if(u!=-1&&!belong[u]&&vis[u]==i)
{
cnt++;
while(belong[u]!=cnt)
{
belong[u]=cnt;
u=pre[u];
}
}
}
if(!cnt) break;
for(i=1;i<=n;i++)
{
if(!belong[i])
{
belong[i]=++cnt;
}
}
for(i=1;i<=m;i++)
{
edge[i].w-=minn[edge[i].v];
edge[i].u=belong[edge[i].u];
edge[i].v=belong[edge[i].v];
}
n=cnt;
root=belong[root];
}
return ans;
}

int main()
{
double ans;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&edge[i].u,&edge[i].v);
edge[i].w=getdis(edge[i].u,edge[i].v);
}
ans=solve(1);
if(ans==-1.0) printf("poor snoopy\n");
else printf("%.2f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: