Command Network

Command Network

Time Limit: 1000MS
Memory Limit: 131072K

Total Submissions: 11970
Accepted: 3482

Description

After a long lasting war on words, a war on arms finally breaks out between
littleken’s and KnuthOcean’s kingdoms. A sudden and violent assault by
KnuthOcean’s force has rendered a total failure of littleken’s command network.
A provisional network must be built immediately. littleken orders snoopy to take
charge of the project.

With the situation studied to every detail, snoopy believes that the most
urgent point is to enable littenken’s commands to reach every disconnected node
in the destroyed network and decides on a plan to build a unidirectional
communication network. The nodes are distributed on a plane. If littleken’s
commands are to be able to be delivered directly from a node A to another node
B, a wire will have to be built along the straight line segment connecting the
two nodes. Since it’s in wartime, not between all pairs of nodes can wires be
built. snoopy wants the plan to require the shortest total length of wires so
that the construction can be done very soon.

Input

The input contains several test cases. Each test case starts with a line
containing two integer N (N ≤ 100), the number of nodes in the
destroyed network, and M (M ≤ 104), the number of pairs
of nodes between which a wire can be built. The next N lines each contain
an ordered pair xi and yi, giving the
Cartesian coordinates of the nodes. Then follow M lines each containing
two integers i and j between 1 and N (inclusive) meaning a
wire can be built between node i and node j for unidirectional
command delivery from the former to the latter. littleken’s headquarter is
always located at node 1. Process to end of file.

Output

For each test case, output exactly one line containing the shortest total
length of wires to two digits past the decimal point. In the cases that such a
network does not exist, just output ‘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
 
完全是照着别人的代码打出来的,第一道最小树形图

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
typedef long long ll;
const double INF=1<<30;
const int N=105;
const int M=10010;
int vis[N],id[N];
int n,m,ecnt,pre[N];
double in[N];

struct edge{
int u,v;
double w;
edge( ) {}
edge(int u,int v,double w):u(u),v(v),w(w) {}
}e[M];

struct node
{
double x,y;
}point[N];

double getdis(node a,node b)
{
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}

double MST(int root,int n,int m)
{
double res=0;
while(1)
{
for(int i = 0; i < n; i++)
in[i] = INF;
for(int i = 0; i < m; i++)
{
int u = e[i].u;
int v = e[i].v;
if(e[i].w < in[v] && u != v)
{pre[v] = u; in[v] = e[i].w;}
}
for(int i = 0; i < n; i++)
{
if(i == root) continue;
if(in[i] == INF) return -1;//除了根以外有点没有入边,则根无法到达它
}
//2.找环
int cnt = 0;
memset(id, -1, sizeof(id));
memset(vis, -1, sizeof(vis));
in[root] = 0;
for(int i = 0; i < n; i++) //标记每个环
{
res += 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)//缩点
{
for(int u = pre[v]; u != v; u = pre[u])
id[u] = cnt;
id[v] = cnt++;
}
}
if(cnt == 0) break; //无环 则break
for(int i = 0; i < n; i++)
if(id[i] == -1) id[i] = cnt++;
for(int i = 0; i < m; i++)
{
int u = e[i].u;
int v = e[i].v;
e[i].u = id[u];
e[i].v = id[v];
if(id[u] != id[v]) e[i].w -= in[v];
}
n = cnt;
root = id[root];
}
return res;
}

void solve()
{
for(int i=0; i<n; i++) scanf("%lf%lf",&point[i].x,&point[i].y);
ecnt=0;
int u,v;
for(int i=0; i<m; i++)
{
scanf("%d%d",&u,&v);
if(u==v) continue;
u--; v--;
double dis=getdis(point[u],point[v]);
e[ecnt++]=edge(u,v,dis);
}
double ans=MST(0,n,ecnt);
if(ans == -1) printf("poor snoopy\n");
else printf("%.2f\n", ans);
}

int main()
{
while(scanf("%d%d",&n,&m)>0) solve();
return 0;
}



Command Network

时间: 2024-08-29 19:22:44

Command Network的相关文章

poj Command Network 最小树形图

规定根节点,求一颗生成树使得权值最小,但由于是有向图,所以最小生成树算法失效. 查资料后得知此类问题叫做最小树形图. 解决最小树形图问题的朱刘算法,算法核心基于找 [最小弧集->找环,消环缩点] 的思想,来慢慢构造树形图. 所有的灵魂都在这张图上.0.0 注意缩点后的弧权值的处理 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algo

POJ 3164 Command Network(最小树形图)

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 13817   Accepted: 3973 Description After a long lasting war on words, a war on arms finally breaks out between littleken’s and KnuthOcean’s kingdoms. A sudden and violent a

POJ3164 Command Network【最小树形图】【朱刘算法】

Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 13398 Accepted: 3868 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent assau

poj3134 Command Network --- 最小树形图

新单词unidirectional get T T 求有向图上,以某点为根的,最小生成树 参考别人的模板 #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<iostream> #include<algorithm> #include<cmath> #define inf 2000000000 using namespac

Poj 3164 Command Network【最小树形图】

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 15914   Accepted: 4583 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent a

POJ 3164 Command Network

Command Network Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on PKU. Original ID: 316464-bit integer IO format: %lld      Java class name: Main After a long lasting war on words, a war on arms finally breaks out between littl

POJ 3164 Command Network 最小树形图-朱刘算法裸题

题目来源:POJ 3164 Command Network 题意:求以1为根的最小树形图 没有输出字符串 思路:直接高朱刘算法 不懂的可以百度 学会了就是直接套模板的事情 其实就是不断消圈而已 不构成圈就有解 无法从根到达其他点就无解 #include <cstdio> #include <cstring> #include <cmath> const int maxn = 110; const int maxm = 50010; const double INF =

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

Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 18769   Accepted: 5392 Description After a long lasting war on words, a war on arms finally breaks out between littleken’s and KnuthOcean’s k

POJ3164 Command Network 【最小树形图】

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 12648   Accepted: 3656 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent a

【POJ 3164】【朱刘算法模板】Command Network

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 13977   Accepted: 4012 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent a