给出平面上一些点,和连接它们的带权有向边,求把所有点连起来的最小总权值。

分析

由于这里边是有向的(unidirectional),所以这是经典的最小树形图问题,可以说是最小树形图的模板题。

代码

这个写法是我乱想的。最近写图啊树啊都喜欢开一个结构体~

这个代码在poj上交,如果用g++的话会WA,因为奇怪的poj需要用%f输出浮点数。更奇怪的是c++直接编译错误,不想说了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=202;
const double inf=1e100;
bool bian[maxn][maxn];
struct node {
double x,y;
} a[maxn];
double dist(node &a,node &b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct edge {
int v;
double w;
int nxt;
};
struct graph {
edge e[maxn*maxn];
int h[maxn],tot,n,from[maxn],tic[maxn],tim,root,sta[maxn],top;
double in[maxn],mi[maxn];
bool vis[maxn],able[maxn];
void clear() {
memset(h,0,sizeof h);
tot=0;
}
void add(int u,int v,double w) {
e[++tot]=(edge){v,w,h[u]};
h[u]=tot;
}
void dfs(int x) {
vis[x]=true;
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) if (able[v]) {
if (v!=root && in[v]>e[i].w) in[v]=e[i].w,from[v]=x;
if (!vis[v]) dfs(v);
}
}
bool circle() {
memset(tic,0,sizeof tic),tim=0;
for (int i=1;i<=n;++i) if (able[i]) {
++tim;
top=0;
for (int j=i;j;j=from[j]) if (!tic[j]) tic[j]=tim,sta[++top]=j; else if (tic[j]==tim) {
for (int k=1;k<=n;++k) if (tic[k]==tim) tic[k]=0;
do {
tic[sta[top--]]=tim;
} while (sta[top+1]!=j);
return true;
}
}
return false;
}
bool work(double &ret) {
memset(vis,0,sizeof vis);
fill(in+1,in+n+1,inf);
dfs(root);
for (int i=1;i<=n;++i) if (able[i] && !vis[i]) {
ret=-1;
return false;
}
bool cc=circle();
if (cc) {
for (int i=1;i<=n;++i) if (able[i] && i!=root && tic[i]==tim) ret+=in[i];
} else {
for (int i=1;i<=n;++i) if (able[i] && i!=root) ret+=in[i];
}
return cc;
}
void reduce() {
fill(mi+1,mi+n+1,inf);
for (int i=1;i<=n;++i) if (able[i] && tic[i]!=tim) {
double w=inf;
for (int j=h[i],v=e[j].v;j;j=e[j].nxt,v=e[j].v) if (tic[v]==tim) w=min(w,e[j].w-in[v]);
if (w!=inf) add(i,n+1,w);
}
for (int i=1;i<=n;++i) if (able[i] && tic[i]==tim) for (int j=h[i],v=e[j].v;j;j=e[j].nxt,v=e[j].v) if (able[v] && tic[v]!=tim) mi[v]=min(mi[v],e[j].w);
for (int i=1;i<=n;++i) if (able[i] && tic[i]!=tim && mi[i]!=inf) add(n+1,i,mi[i]);
for (int i=1;i<=n;++i) if (tic[i]==tim) able[i]=false;
++n;
if (!able[root]) root=n;
}
double MGT(int _n) {
memset(able,true,sizeof able),n=_n,root=1;
double ret=0;
while (work(ret)) {
reduce();
}
return ret;
}
} A;
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("my.out","w",stdout);
#endif
int n,m;
while (~scanf("%d%d",&n,&m)) {
A.clear();
memset(bian,0,sizeof bian);
for (int i=1;i<=n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);
for (int i=1;i<=m;++i) {
int u,v;
scanf("%d%d",&u,&v);
if (u==v || bian[u][v]) continue;
bian[u][v]=true;
double d=dist(a[u],a[v]);
A.add(u,v,d);
}
double ans=A.MGT(n);
if (ans<0) puts("poor snoopy"); else printf("%.2lf\n",ans);
}
return 0;
}

poj3164-Command Network的更多相关文章

  1. POJ3164 Command Network —— 最小树形图

    题目链接:https://vjudge.net/problem/POJ-3164 Command Network Time Limit: 1000MS   Memory Limit: 131072K ...

  2. POJ3164 Command Network(最小树形图)

    图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...

  3. POJ3164:Command Network(有向图的最小生成树)

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 20766   Accepted: 5920 ...

  4. Command Network

    Command Network Time Limit: 1000MSMemory Limit: 131072K Total Submissions: 11970Accepted: 3482 Descr ...

  5. POJ 3164 Command Network 最小树形图

    题目链接: 题目 Command Network Time Limit: 1000MS Memory Limit: 131072K 问题描述 After a long lasting war on w ...

  6. POJ3436 Command Network [最小树形图]

    POJ3436 Command Network 最小树形图裸题 傻逼poj回我青春 wa wa wa 的原因竟然是需要%.2f而不是.2lf 我还有英语作业音乐作业写不完了啊啊啊啊啊啊啊啊啊 #inc ...

  7. POJ 3164 Command Network ( 最小树形图 朱刘算法)

    题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...

  8. Command Network OpenJ_Bailian - 3436(最小有向生成树模板题)

    链接: http://poj.org/problem?id=3164 题目: Command Network Time Limit: 1000MS   Memory Limit: 131072K To ...

  9. poj 3164 Command Network(最小树形图模板)

    Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS   Memory Limit: 131072K Total Subm ...

  10. POJ 3164——Command Network——————【最小树形图、固定根】

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 15080   Accepted: 4331 ...

随机推荐

  1. [Jmeter并发报错解决方案]org.apache.http.NoHttpResponseException: 10.0.4.147:8000 failed to respond

    背景:公司模型框架是Nginx+uwsgi+Django+nginx,一开始使用Jmeter进行高并发请求测试,发现成功率只有50%,换用postman,成功率100%,代码进行高并发一样不会报错. ...

  2. Android 模拟器 下载、编译及调试

    Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...

  3. Selenium(Python) ddt读取Excel文件数据驱动

    首先, 引入xlrd模块: ExcelDDT.py: import unittestfrom time import sleep from ddt import ddt, datafrom selen ...

  4. 项目实战:BBS+Blog项目开发

    01-博客系统之功能需求 02-博客系统之表结构设计1 03-博客系统之表结构设计2 04-博客系统之表结构设计3 05-博客系统之表结构设计4 06-博客系统之表机构设计5 07-博客系统之创建系统 ...

  5. 教你一招,提升你Python代码的可读性,小技巧

    Python的初学者,开发者都应该知道的代码可读性提高技巧,本篇主要介绍了如下内容: PEP 8是什么以及它存在的原因 为什么你应该编写符合PEP 8标准的代码 如何编写符合PEP 8的代码 为什么我 ...

  6. 【system.folder】使用说明

    对象:system.folder 说明:提供一系列针对文件夹的操作 目录: 方法 返回 说明 system.folder.exists(folderPath) [True | False] 检测指定文 ...

  7. 【转】Bootstrap FileInput中文API整理

    Bootstrap FileInput中文API整理 这段时间做项目用到bootstrap fileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档, ...

  8. 「雅礼集训 2017 Day1」市场 (线段树除法,区间最小,区间查询)

    老师说,你们暴力求除法也整不了多少次就归一了,暴力就好了(应该只有log(n)次) 于是暴力啊暴力,结果我归天了. 好吧,在各种题解的摧残下,我终于出了一篇巨好看(chou lou)代码(很多结构体党 ...

  9. 正则表达式 和 re 模块

    正则表达式究竟是什么? 在一些网站注册的时候需要输入手机号码,当你输入一个错误的手机号码的时候,会提示你输入的手机号码格式错误 那么他究竟是如何判断的呢? 我们用Python代码进行表示: phone ...

  10. 为什么安装beego和框架的失败 以及常用命令

    1.安装了几个版本,版本之间相互影响. 把没用的删掉 2.网上找的教程存在问题. 都是相互抄袭.最权威的还是官网. which go rm -rf test/ echo path 获取路径 vim ~ ...