codeForces 472D 最小生成树
2017-07-28 21:43
435 查看
题目大意:给出一个图中点的两两距离,问是否是一棵树,若是,求出平均边权最大的点
prim最小生成树,若原图是树,则最小生成树的距离就是原距离。否则不是。
搞出来树了,第二问随便dfs就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 2550
using namespace std;
int T,n,fa
,pp
;
long long dis
,minn
,a
,ans,num;
bool boo;
double maxn;
int final;
int head
,e=1;
struct edge{
int u,v,w,next;
}ed[2*N];
void add(int u,int v,int w){
ed[e].u=u; ed[e].v=v; ed[e].w=w;
ed[e].next=head[u]; head[u]=e++;
}
bool bo
;
void dfs(int x,int now,long long d){
if(bo[now])return;
bo[now]=1;
dis[x][now]=d;
for(int i=head[now];i;i=ed[i].next)
dfs(x,ed[i].v,d+ed[i].w);
}
int main()
{
//freopen("treas.in","r",stdin);
//freopen("treas.out","w",stdout);
scanf("%d",&T);
while(T--){
memset(head,0,sizeof head); e=1;
memset(bo,0,sizeof bo);
memset(minn,0x7f,sizeof minn);
scanf("%d",&n); boo=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
for(int i=1;i<=n;i++){
minn[i]=a[1][i];
pp[i]=1;
}
bo[1]=1; fa[1]=0;
for(int i=1;i<n;i++)
{
int now=0;
for(int j=1;j<=n;j++)
if(!bo[j]&&minn[j]<minn[now])
now=j;
bo[now]=1; fa[now]=pp[now];
add(pp[now],now,a[pp[now]][now]);
add(now,pp[now],a[now][pp[now]]);
for(int j=1;j<=n;j++)
if(!bo[j]&&a[now][j]<minn[j]){
minn[j]=a[now][j];
pp[j]=now;
}
}
//for(int i=1;i<=n;i++)
//printf("%d %d\n",i,fa[i]);
for(int i=1;i<=n;i++){
memset(bo,0,sizeof(bo));
dfs(i,i,0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//printf("%lld ",dis[i][j]);
if(a[i][j]!=dis[i][j]){
boo=1; break;
}
}if(boo==1) break;
//printf("\n");
}if(boo==1){printf("No\n"); continue;}
maxn=0; final=1;
for(int i=1;i<=n;i++){
num=ans=0;
for(int j=head[i];j;j=ed[j].next){
num++;
ans+=ed[j].w;
}
if((double)(1.0*ans)/(1.0*num)>maxn){
final=i;
maxn=(double)(1.0*ans)/(1.0*num);
}
}
printf("Yes\n%d\n",final);
}
}
prim最小生成树,若原图是树,则最小生成树的距离就是原距离。否则不是。
搞出来树了,第二问随便dfs就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 2550
using namespace std;
int T,n,fa
,pp
;
long long dis
,minn
,a
,ans,num;
bool boo;
double maxn;
int final;
int head
,e=1;
struct edge{
int u,v,w,next;
}ed[2*N];
void add(int u,int v,int w){
ed[e].u=u; ed[e].v=v; ed[e].w=w;
ed[e].next=head[u]; head[u]=e++;
}
bool bo
;
void dfs(int x,int now,long long d){
if(bo[now])return;
bo[now]=1;
dis[x][now]=d;
for(int i=head[now];i;i=ed[i].next)
dfs(x,ed[i].v,d+ed[i].w);
}
int main()
{
//freopen("treas.in","r",stdin);
//freopen("treas.out","w",stdout);
scanf("%d",&T);
while(T--){
memset(head,0,sizeof head); e=1;
memset(bo,0,sizeof bo);
memset(minn,0x7f,sizeof minn);
scanf("%d",&n); boo=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
for(int i=1;i<=n;i++){
minn[i]=a[1][i];
pp[i]=1;
}
bo[1]=1; fa[1]=0;
for(int i=1;i<n;i++)
{
int now=0;
for(int j=1;j<=n;j++)
if(!bo[j]&&minn[j]<minn[now])
now=j;
bo[now]=1; fa[now]=pp[now];
add(pp[now],now,a[pp[now]][now]);
add(now,pp[now],a[now][pp[now]]);
for(int j=1;j<=n;j++)
if(!bo[j]&&a[now][j]<minn[j]){
minn[j]=a[now][j];
pp[j]=now;
}
}
//for(int i=1;i<=n;i++)
//printf("%d %d\n",i,fa[i]);
for(int i=1;i<=n;i++){
memset(bo,0,sizeof(bo));
dfs(i,i,0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//printf("%lld ",dis[i][j]);
if(a[i][j]!=dis[i][j]){
boo=1; break;
}
}if(boo==1) break;
//printf("\n");
}if(boo==1){printf("No\n"); continue;}
maxn=0; final=1;
for(int i=1;i<=n;i++){
num=ans=0;
for(int j=head[i];j;j=ed[j].next){
num++;
ans+=ed[j].w;
}
if((double)(1.0*ans)/(1.0*num)>maxn){
final=i;
maxn=(double)(1.0*ans)/(1.0*num);
}
}
printf("Yes\n%d\n",final);
}
}
相关文章推荐
- codeForces 472D 最小生成树
- Codeforces 125E MST Company (单度限制最小生成树)
- 【Codeforces 609E】【Stree】【最小生成树】
- Codeforces 606 D Lazy Student【逆最小生成树+思维】好题
- Codeforces - 605B. Lazy Student - 构造最小生成树
- CodeForces 472D Design Tutorial: Inverse the Problem (最小生成树)
- CodeForces 141E: ...(最小生成树)
- [最小生成树] Codeforces 632F Educational Codeforces Round 9 F. Magic Matrix & SRM 687 div1 AllGraphCuts
- (最小生成树)Codeforces 76 A Gift
- Codeforces 892/E Envy 最小生成树的query
- 【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】
- codeforces 632F. Magic Matrix (最小生成树)
- 最小生成树(kruskal)Codeforces 472D
- CodeForces - 939D Love Rescue (最小生成树)
- CodeForces 827D Round #423 Div2F&Div1D:LCA+路径压缩+MST(最小生成树)
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
- CodeForces 609E Minimum spanning tree for each edge (lca+最小生成树+倍增)
- Design Tutorial: Inverse the Problem CodeForces - 472D 最小生成树,好题目
- codeforces 733F LCA+最小生成树
- Codeforces 827D Best Edge Weight (最小生成树 + 树链剖分/倍增/并查集)