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一下有没有两两之 ...
随机推荐
- BZOJ 1063 道路设计(树形DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1063 题意:给出一个无环图( 也就是树,但是也有可能是森林),代表一个国家的城市.1是首 ...
- windows的gvim总是报错: +iconv fencview.vim
iconv是用来转换gvim文件的编码的, 需要插件: iconv.dll gvim7.3的文件目录结构: vim/vim73是它的核心文件, 而vimfiles是扩展文件, 里面的plugin是专门 ...
- 织梦dedecms多选checkbox字段值独立输出样式调用方法
在做织梦网站时发现dedecms的自建字段的checkboxcook输出是一段证不能把每个标签分开写样式,在晚上查了好多没页没有好的,最终用中方式来做会好 {dede:field.fyuantese ...
- Educational Codeforces Round 57 (Rated for Div. 2)
我好菜啊. A - Find Divisible 好像没什么可说的. #include<cstdio> #include<cstring> #include<algori ...
- 使用 PYTHON 为 PIP 搭建 HTTP 代理
在一台没有 Root 权限的机器上,部署使用 Python 编写的服务,似乎只有 virtualenv 一条路可以选了. 当然我见过一些同事会在自己的家目录编译一个,然后设置一下 $PATH ,但是从 ...
- Apache+Php+Mariadb+NFS+discuz
安装LAMP服务器,并利用discuz做测试 nfs + discuz 192.168.108.158 php + DNS 192.168.108.160 apache ...
- robot_pose的类型
http://docs.ros.org/api/geometry_msgs/html/msg/Pose.html
- 关于nohup 和 &的使用
nohup 是 no hang up 的缩写,意思是不挂断运行,一直运行下去,永久运行下去,但是注意并没有后台运行的功能 & 是在后台运行的意思 单独使用一个命令,还不能在终端关闭的时候,让 ...
- SQL Insert Case When Update
CREATE TABLE LoadTestTable ( ID INT IDENTITY(1,1), FIRSTNAME VARCHAR(50), LASTNAME VARCHAR(50), GEND ...
- jQuery双击编辑td数据
html <td class="remark" style="width: 200px;"> {$vo.remark} </td> js ...