UESTC-888-Absurdistan Roads(kruskal+floyd)
The people of Absurdistan discovered how to build roads only last year. After the discovery, every city decided to build their own road connecting their city
with another city. Each newly built road can be used in both directions.
Absurdistan is full of surprising coincidences. It took all N cities
precisely one year to build their roads. And even more surprisingly, in the end it was possible
to travel from every city to every other city using the newly built roads.
You bought a tourist guide which does not have a map of the country with the new roads. It only contains a huge table with the shortest distances between all
pairs of cities using the newly built roads. You would like to know between which pairs of cities there are roads and how long they are, because you want to
reconstruct the map of the N newly
built roads from the table of shortest distances.
You get a table of shortest distances between all pairs of cities in Absurdistan using the N roads
built last year. From this table, you must reconstruct the road
network of Absurdistan. There might be multiple road networks with N roads
with that same table of shortest distances, but you are happy with any one of
those networks.
Input
For each test case:
- A line containing an integer N (2≤N≤2000) --
the number of cities and roads. - N lines
with N numbers
each. The j-th
number of the i-th
line is the shortest distance from city i to
city j.
All distances between two distinct cities will be - positive and at most 1000000.
The distance from i to i will
always be 0 and
the distance from i to j will
be the same as the distance from jto i.
Output
For each test case:
- Print N lines
with three integers 'a b c'
denoting that there is a road between cities 1≤a≤N and 1≤b≤N of
length 1≤c≤1000000,
where a≠b.
If there are - multiple solutions, you can print any one and you can print the roads in any order. At least one solution is guaranteed to exist.
Print a blank line between every two test cases.
Sample input and output
| Sample Input | Sample Output |
|---|---|
4 |
2 1 1 |
Source
思路:先用kruskal求出n-1条边。那么n-1条边必然是满足的,接下来仅仅须要再找一条边就能够了,直接按权值从小到大枚举全部边直到找到一条边的距离与前面n-1条边构成的图里面该条边的距离不相等就可以,假设没找到就随便输出前n-1条边中的随意一条。
#include <stdio.h>
#include <algorithm>
#define INF 999999999
using namespace std; struct E{
int u,v,val;
bool operator<(const E &p) const
{
return val<p.val;
}
}e[4000005]; int node[2005],dis[2005][2005]; int findroot(int x)
{
if(node[x]!=x) return node[x]=findroot(node[x]); return node[x];
} int main()
{
int n,i,j,k,t,u,v,val,cnt,roota,rootb;
bool first=1; while(~scanf("%d",&n))
{
if(first) first=0;
else puts(""); cnt=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++)
{
scanf("%d",&val); if(i<=j) continue; e[cnt].u=i;
e[cnt].v=j;
e[cnt++].val=val;
} sort(e,e+cnt); for(i=1;i<=n;i++) node[i]=i;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=INF; t=0; for(i=0;i<cnt;i++)
{
roota=findroot(e[i].u);
rootb=findroot(e[i].v); if(roota!=rootb)
{
node[roota]=rootb; dis[e[i].u][e[i].v]=dis[e[i].v][e[i].u]=e[i].val; u=e[i].u,v=e[i].v,val=e[i].val; printf("%d %d %d\n",e[i].u,e[i].v,e[i].val); t++; if(t>=n-1) break;
}
} for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(dis[i][k]==INF) break;//没有这个优化直接T了。。。 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
} for(i=0;i<cnt;i++)
{
if(e[i].val!=dis[e[i].u][e[i].v])
{
printf("%d %d %d\n",e[i].u,e[i].v,e[i].val); break;
}
} if(i==cnt) printf("%d %d %d\n",u,v,val);
}
}
UESTC-888-Absurdistan Roads(kruskal+floyd)的更多相关文章
- CDOJ 888 Absurdistan Roads
Absurdistan Roads Time Limit: 5678/3456MS (Java/Others) Memory Limit: 65432/65432KB (Java/Others ...
- UESTC 30 最短路,floyd,水
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...
- HDU 1102 Constructing Roads(kruskal)
Constructing Roads There are N villages, which are numbered from 1 to N, and you should build some r ...
- POJ1251 Jungle Roads(Kruskal)(并查集)
Jungle Roads Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23882 Accepted: 11193 De ...
- POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19884 Accepted: 83 ...
- HDU1301 Jungle Roads(Kruskal)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- POJ 2421 Constructing Roads(Kruskal算法)
题意:给出n个村庄之间的距离,再给出已经连通起来了的村庄.求把所有的村庄都连通要修路的长度的最小值. 思路:Kruskal算法 课本代码: //Kruskal算法 #include<iostre ...
- POJ1251 Jungle Roads Kruskal+scanf输入小技巧
Jungle Roads The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ai ...
- hdu 1102 Constructing Roads(kruskal || prim)
求最小生成树.有一点点的变化,就是有的边已经给出来了.所以,最小生成树里面必须有这些边,kruskal和prim算法都能够,prim更简单一些.有一点须要注意,用克鲁斯卡尔算法的时候须要将已经存在的边 ...
随机推荐
- 导致flash屏幕重绘的几种方式及避免重绘的方法
导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...
- Android——编译odex保护
编译过android源代码的可能试验过改动编译类型.android的初始化编译配置可參考Android--编译系统初始化设置 一.TARGET_BUILD_VARIANT=user 当选择的编译类型为 ...
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- jquery使用load开展局部刷新没有效果
jquery使用load开展局部刷新没有效果 jquery使用load进行局部刷新没有效果我的代码 <html><head><meta charset="u ...
- SQLLoader4(数据文件中的列与表中列不一致情况-filler)
A.数据文件中字段个数少于表中列字段个数,但数据文件中缺少的列,在表定义中可以为空.----- 这种情况是比较简单的,只需要将数据文件中数据对应的列的名字写到控制文件中即可.因为SQL*Loader是 ...
- EffectiveC#12,13,14--成员初始化
1.在一个类里声明变量的同时,直接创建实例值.包括静态的和实例的变量 例:object m_o = new object(); 如下情况时不建议这么做:第一种 值类型. int i=new int() ...
- SICP阅读笔记(一)
2015-08-25 008 Foreword QUOTE: I think that it's extraordinarily important that we in compute ...
- Jquery根据字段内容设置字段宽度
来博客园很久了,初次写文章,新手,请大牛见谅! 前段时间遇到的问题,通过gridview后台动态生成table,列和行数量未知,要求根据每个单元格内容的多少,设置宽度,每一列选择本列最大的宽度. ta ...
- uva 1596 Bug Hunt
In this problem, we consider a simple programming language that has only declarations of one-dimensi ...
- 解不定方程ax+by=m的最小解
给出方程a*x+b*y=c,其中所有数均是整数,且a,b,c是已知数,求满足那个等式的x,y值?这个方程可能有解也可能没解也可能有无穷多个解(注意:这里说的解都是整数解)? 既然如此,那我们就得找出有 ...