问题 C: 藏宝图
时间限制: 2 Sec 内存限制: 256 MB题目描述
Czy爬上黑红树,到达了一个奇怪的地方……
Czy发现了一张奇怪的藏宝图。图上有n个点,m条无向边。已经标出了图中两两之间距离dist。但是czy知道,只有当图刚好又是一颗树的时候,这张藏宝图才是真的。如果藏宝图是真的,那么经过点x的边的边权平均数最大的那个x是藏着宝物的地方。请计算这是不是真的藏宝图,如果是真的藏宝之处在哪里。
输入
输入数据第一行一个数T,表示T组数据。
对于每组数据,第一行一个n,表示藏宝图上的点的个数。
接下来n行,每行n个数,表示两两节点之间的距离。
输出
输出一行或两行。第一行”Yes”或”No”,表示这是不是真的藏宝图。
若是真的藏宝图,第二行再输出一个数,表示哪个点是藏宝之处。
样例输入
230 7 97 0 29 2 030 2 72 0 97 9 0
样例输出
Yes1Yes3样例解释:第一棵树的形状是1--2--3。1、2之间的边权是7,2、3之间是2。 第二棵树的形状是2--1--3。2、1之间的边权是2,1、3之间是7。
提示
对于30%数据,n<=50,1<=树上的边的长度<=10^9。
对于50%数据,n<=600.
对于100%数据,1<=n<=2500,除30%小数据外任意0<=dist[i][j]<=10^9,T<=5
最小生成树
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<set>
#include<deque>
#include<cstdlib>
#include<algorithm>
#define V 2505
#define mod 1000000007
#define LL long long
using
namespace
std;
int
n,m,vis[V];
int
rt;
LL mx;
LL a[V][V],d[V];
int
ts;
int
f[V],is[V],ans;
LL it[V];
struct
da
{
int
to,next;
}Edge[V*5];
int
head[V],tot;
inline
void
add(
int
x,
int
y)
{
Edge[tot].to=y;
Edge[tot].next=head[x];
head[x]=tot++;
}
inline
void
dd()
{
memset
(d,127,
sizeof
(d));
d[1]=0;
while
(1)