POJ 3164 Command Network(最小树形图)
2016-03-13 20:37
489 查看
Description
给出n个点的坐标和m条有向边,边权为两点间距离,求这张图的最小树形图
Input
多组用例,每组用例第一行为两个整数n和m表示点数和边数,之后n行每行两个整数x和y表示该点坐标,之后m行每行两个整数a和b表示点a到点b之间有一条有向边,以文件尾结束输入(n<=100,m<=10000)
Output
对于每组用例,如果该图以1为起点存在最小树形图则输出最小树形图的权值和,否则输出”poor snoopy”
Sample Input
4 6
0 6
4 6
0 0
7 20
1 2
1 3
2 3
3 4
3 1
3 2
4 3
0 0
1 0
0 1
1 2
1 3
4 1
2 3
Sample Output
31.19
poor snoopy
Solution
最小树形图裸题
Code
给出n个点的坐标和m条有向边,边权为两点间距离,求这张图的最小树形图
Input
多组用例,每组用例第一行为两个整数n和m表示点数和边数,之后n行每行两个整数x和y表示该点坐标,之后m行每行两个整数a和b表示点a到点b之间有一条有向边,以文件尾结束输入(n<=100,m<=10000)
Output
对于每组用例,如果该图以1为起点存在最小树形图则输出最小树形图的权值和,否则输出”poor snoopy”
Sample Input
4 6
0 6
4 6
0 0
7 20
1 2
1 3
2 3
3 4
3 1
3 2
4 3
0 0
1 0
0 1
1 2
1 3
4 1
2 3
Sample Output
31.19
poor snoopy
Solution
最小树形图裸题
Code
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define INF 0x3f3f3f3f #define maxn 111 #define maxm 22222 struct Edge { int u,v; double c; }edge[maxm]; int n,m,pre[maxn],id[maxn],vis[maxn]; double in[maxn]; double zhuliu(int root) { double ans=0; int u,v; while(1) { for(int i=0;i<n;i++)in[i]=INF; for(int i=0;i<m;i++) if(edge[i].u!=edge[i].v&&edge[i].c<in[edge[i].v]) { pre[edge[i].v]=edge[i].u; in[edge[i].v]=edge[i].c; } for(int i=0;i<n;i++) if(i!=root&&in[i]==INF) return -1; int res=0; memset(vis,-1,sizeof(vis)); memset(id,-1,sizeof(id)); in[root]=0; for(int i=0;i<n;i++) { ans+=in[i]; v=i; while(vis[v]!=i&&id[v]==-1&&v!=root) { vis[v]=i; v=pre[v]; } if(id[v]==-1&&v!=root) { for(u=pre[v];u!=v;u=pre[u]) id[u]=res; id[v]=res++; } } if(res==0)break; for(int i=0;i<n;i++) if(id[i]==-1) id[i]=res++; 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++].c-=in[v]; else swap(edge[i],edge[--m]); } n=res; root=id[root]; } return ans; } struct node { double x,y; }p[maxn]; double dis(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); a--,b--; edge[i].u=a,edge[i].v=b,edge[i].c=dis(p[a],p[b]); } double ans=zhuliu(0); if(ans==-1)printf("poor snoopy\n"); else printf("%.2f\n",ans); } return 0; }
相关文章推荐
- 无向图的广度优先搜索
- 增强现实-机器人-人工智能-云计算
- iOS视频播放器
- Ubuntu 部署Python开发环境
- linux内核分析 第三周
- 包装设计模式
- 分布式文件系统Fastdfs 详细安装笔记
- fragment 滑动 viewPager
- c++是不是类型安全
- XILINX 内核下载
- 《计算机网络原理》之第2、3章
- IMF 传奇行动 启动SPARK master无法启动 内存不够问题解决) failed to map 715849728 bytes for committing reserved memory.
- jsp页面间的传值方法
- java设计模式——结构型之代理模式
- Visual Studio内存泄漏调试
- 浏览器中的javaScript
- C# 异步和委托学习
- 一种较为隐蔽ConcurrentModificationException情形
- lab3:跟踪分析Linux内核的启动过程
- 今天学会了一个新的技术int.TryParse(id,out x)