POJ 3164 Command Network 最小树形图
2015-11-12 17:53
387 查看
题意:
有向图,求以1为根的最小树形图的边权之和。
解析:
练了下模板。
算法流程哪都有。
代码:
有向图,求以1为根的最小树形图的边权之和。
解析:
练了下模板。
算法流程哪都有。
代码:
#include <cmath> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 110 #define M 11000 #define x first #define y second #define eps 1e-6 #define INF 0x7fffffff using namespace std; typedef pair<double,double>Pa; int tot; struct Edge { int u,v; double val; Edge(){} Edge(int _u,int _v,double _val):u(_u),v(_v),val(_val){} }edge[M]; Pa point ; int n,m,u,v; double get_dis(Pa &a,Pa &b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } namespace Minimal_Tree_Graph { #define fr edge[i].u #define to edge[i].v #define Val edge[i].val int id ,pre ,vis ; double in ; double work(int root,int n) { double ret=0; while(true) { for(int i=1;i<=n;i++) in[i]=INF; for(int i=1;i<=m;i++) if(in[to]>Val&&fr!=to) in[to]=Val,pre[to]=fr; for(int i=1;i<=n;i++) if(in[i]==INF&&i!=root)return -1; int cnt_ring=0; memset(id,-1,sizeof(id)); memset(vis,-1,sizeof(vis)); in[root]=0; for(int i=1;i<=n;i++) { ret+=in[i]; int v=i; while(vis[v]!=i&&id[v]==-1&&v!=root){vis[v]=i;v=pre[v];} if(v!=root&&id[v]==-1) { cnt_ring++; for(int u=pre[v];u!=v;u=pre[u])id[u]=cnt_ring; id[v]=cnt_ring; } } if(!cnt_ring)break; for(int i=1;i<=n;i++) if(id[i]==-1)id[i]=++cnt_ring; for(int i=1;i<=m;i++) { int u=edge[i].u; int v=edge[i].v; edge[i].u=id[u]; edge[i].v=id[v]; if(id[u]!=id[v])edge[i].val-=in[v]; } n=cnt_ring; root=id[root]; } return ret; } } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) scanf("%lf%lf",&point[i].x,&point[i].y); for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); double val=get_dis(point[u],point[v]); if(u==v)edge[i]=Edge(u,v,INF); else edge[i]=Edge(u,v,val); } double ans=Minimal_Tree_Graph::work(1,n); if(ans==-1)puts("poor snoopy"); else printf("%.2f\n",ans); } }
相关文章推荐
- 热更新如果是android平台的话,可以直接.cs文件到本地,然后使用反射进行加载。 如果是IOS平台的话,就没有办法直接更新.cs文件了,可以使用ULua进行搞定。
- Gradle命令详解与导入第三方包
- 子集和问题
- UVA 12003 Array Transformer (分块)
- spring―hibernate查询
- hdu 3473 Minimum Sum(划分树)
- Linux服务器部署应用程序注意事项
- 远程文件下载
- WPF中设置Border的BorderThickness属性会让背景图片产生模糊感
- Dig HOWTO 中文手册--dig命令使用大全
- LoadRunner小技巧集锦
- java中volatile关键字的含义
- iOS 保持界面流畅的技巧
- VS2010在调试时产生断点错位怎么解决
- HDU-2539点球大战
- Fragment中获取Activity的Context
- Loadrunner 接口测试的两种方法
- 分布式视频分享网站
- NFS文件系统搭建
- Android 解析xml的三种方式