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;
}
点击打开链接(无根)
算法讲解 点击打开链接
存模板#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;
}
相关文章推荐
- HDU 2121-Ice_cream’s world II
- HDU 2121 Ice_cream’s world II(最小树形图)
- hdu 2121 Ice_cream’s world II
- HDU 2121 Ice_cream’s world II(无固定根最小树形图、找最小根)
- HDU 2121 Ice_cream’s world II 最小树形图 模板
- HDU 2121 Ice_cream’s world II (不定根最小树形图)
- [HDU]2121 Ice_cream’s world II 朱刘算法(不固定根)
- HDU 2121 Ice_cream’s world II
- hdu 2121 Ice_cream’s world II(最小树形图,不定根)
- hdu 2121 Ice_cream’s world II(不定根的最小树形图)
- HDU 2121 Ice_cream’s world II 无固定点的最小树形图 朱刘算法
- HDU 2121 Ice_cream’s world II 无固定根的最小树形图以及最小根
- hdu 2121 Ice_cream’s world II
- HDU 2121 Ice_cream’s world II
- HDU ACM 2121 Ice_cream’s world II (无根最小树形图)
- HDU 2121 Ice_cream’s world II 不定根最小树形图
- HDU 2121 Ice_cream’s world II (不定根最小树形图求根)
- HDU - 2121-Ice_cream’s world II-无根最小树形图
- Ice_cream’s world II - HDU 2121 - 最小树形图
- HDU 2121 Ice_cream’s world II 不定根最小树形图