bzoj3332
题解:
首先只有存在的路有可能有值
然后在存储矩阵的同时对于本来就有边的情况直接存下来这条边的值
然后跑一次最大生成树
在最大生成树的同时就可以求出矩阵的信息。
代码:
#include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
const int N=1e3+;
int t,n,m,sta,fin,mapy[N][N],mapy2[N][N],fa[N],son[N][N],cnt,ans;
struct node
{
int sta,fin,wor;
}roa[N*];
int read()
{
int x=;
char ch=getchar();
bool positive=;
for (;!isdigit(ch);ch=getchar())
if (ch=='-')positive=;
for (;isdigit(ch);ch=getchar())x=x*+ch-'';
return positive?x:-x;
}
void addedge(int sta,int fin)
{
mapy[sta][fin]=read();
roa[++cnt].sta=sta;
roa[cnt].fin=fin;
roa[cnt].wor=mapy[sta][fin];
}
int fath(int u)
{
return fa[u]=(fa[u]==u?u:fath(fa[u]));
}
void check(int sta,int fin)
{
if(sta==fin&&mapy[sta][fin]!=)ans=;
if(sta>fin&&mapy[sta][fin]!=mapy[fin][sta])ans=;
}
void init()
{
n=read();m=read();cnt=;
clr(mapy);clr(mapy2);clr(fa);
clr(son);clr(roa);
for(int i=;i<=n;i++)fa[i]=son[i][++son[i][]]=i;
for(int i=;i<=m;i++)
{
sta=read();fin=read();
if(sta>fin)swap(sta,fin);
mapy[sta][fin]=;
}
ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(mapy[i][j])addedge(i,j);
else mapy[i][j]=read();
check(i,j);
}
}
bool cmp(node x,node y)
{
return x.wor>y.wor;
}
void unio(int u)
{
int fa1=fa[roa[u].sta],fa2=fa[roa[u].fin];
fa[fa1]=fa2;
for(int i=;i<=son[fa1][];i++)
for(int j=;j<=son[fa2][];j++)
mapy2[son[fa1][i]][son[fa2][j]]=
mapy2[son[fa2][j]][son[fa1][i]]=roa[u].wor;
for(int i=;i<=son[fa1][];i++)son[fa2][++son[fa2][]]=son[fa1][i];
}
int work(int cur)
{
printf("Case #%d: ",cur);
if(ans)return ans;
sort(roa+,roa+m+,cmp);
for(int i=;i<=m;i++)
{
if(fath(roa[i].sta)==fath(roa[i].fin))continue;
unio(i);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(fath(i)!=fath(j)){if(mapy[i][j]!=-)ans=;}
else if(mapy2[i][j]!=mapy[i][j])ans=;
}
return ans;
}
int main()
{
t=read();
for (int i=;i<=t;i++)
{
init();
if(work(i))puts("No");
else puts("Yes");
}
return ;
}
bzoj3332的更多相关文章
- bzoj3332: 旧试题
这题就是最大生成树. 把两个点之间的期望建边排序. 把相同的期望一起做,那么在这个做之前,这些有着相同期望的点两两肯定不连,否则就输出No了. 相同的做完之后,再次for一遍check一下有没有两两之 ...
随机推荐
- Wireshark 显示域名列
一般使用Wireshark只能看到ip地址,但是看域名更方便更简明 只要修改一个配置就可以 编辑-->首选项 勾选Resolve network(IP) addresses 重新捕捉:
- 【附3】springboot源码解析 - 构建SpringApplication
package com.microservice.framework; import org.springframework.boot.SpringApplication; import org.sp ...
- 51nod 1284 2 3 5 7的倍数
从1到N 里 是2的倍数 有 N/2 个 然后大概看过这类的blog 所以运用容斥原理 直接计算 是 2 3 5 7 的个数都是多少 然后用N 减去 就是 不是2 3 5 7 的个数了 (离散好像也 ...
- input标签type=button时,如何禁用和开启按钮
本文为博主原创,未经允许不得转载: <input id="exportCameraButton" type="button" class="bt ...
- 前端验证用户登陆状态(vue.js)
首先用户需要进行登陆(请求登陆接口),接口请求成功之后后台会返回对应的用户信息(可以把用户信息存放在浏览器缓存中),并且后台会设置浏览器的cookie值(可以在network->header-& ...
- Linux的内存分页管理【转】
内存是计算机的主存储器.内存为进程开辟出进程空间,让进程在其中保存数据.我将从内存的物理特性出发,深入到内存管理的细节,特别是了解虚拟内存和内存分页的概念. 内存 简单地说,内存就是一个数据货架.内存 ...
- [CentOS_7.4]Linux编译安装mono环境
一 安装mono 安装过程: 下载mono安装源,配置,编译,安装,设置环境变量. # wget http://download.mono-project.com/sources/mono/mono- ...
- 性能测试 tps持续走低,响应时间持续增加,瓶颈分析
吞吐量图如上 响应时间图如上 自身压测的机器,资源使用率并没有饱和 服务器,top命令下看到load average的值很低,本身是4核的server. 每个核的CPU使用率也极低,空闲cpu占95+ ...
- JavaMai——邮箱验证用户注册
这篇文章简单的模拟了网上利用邮箱激活用户注册这样的一个功能 1. 呈现给用户的注册界面:(为了简单起见,就剩下两个输入域,邮箱和昵称) <%@ page language="java& ...
- Caffe 学习系列
学习列表: Google protocol buffer在windows下的编译 caffe windows 学习第一步:编译和安装(vs2012+win 64) caffe windows学习:第一 ...