CF402E Strictly Positive Matrix(矩阵,强联通分量)
题意
给定一个 n∗n 的矩阵 A,每个元素都非负判断是否存在一个整数 k 使得 A^k 的所有元素 >0 n≤2000(矩阵中[i][i]保证为1)
题解
考虑矩阵$A*A$的意义 ,设得到的矩阵为B矩阵中的一个元素$B[i][j]=\sum_{k=1}^{n}A[i][k]*A[k][j]$,$A[i][k]*A[k][j]$非负当且仅当$A[i][k]$和$A[k][j]$非负。
这跟$弗洛伊德$差不多,枚举中间点,我们把$A[i][j]$非负理解为一个图中有一条$A$从$i$到$j$的边,$A^k$中$A[i][j]$就代表从i到j有没有一条长度小于等于$k$的路径。
此题本质上就是问根据所给矩阵建图,是否全图为一个强联通分量。
所以就上$Tarjan$模板就行了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int cnt,head[N];
int dfn[N],low[N],stack[N],top,tot,vis[N],num,c[N];
int n;
struct edge{
int to,nxt;
}e[];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;
stack[++top]=u;
vis[u]=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dfn[v]==){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int x;
num++;
do{
x=stack[top--];
c[x]=num;
vis[x]=;
}while(u!=x);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=,a;j<=n;j++){
scanf("%d",&a);
if(i==j||a==)continue;
add(i,j);
}
for(int i=;i<=n;i++){
if(dfn[i]==)Tarjan(i);
}
for(int i=;i<=n;i++){
if(c[i]>){
printf("NO");
return ;
}
}
printf("YES");
return ;
}
CF402E Strictly Positive Matrix(矩阵,强联通分量)的更多相关文章
- [CF #236 (Div. 2) E] Strictly Positive Matrix(强联通分量)
		
题目:http://codeforces.com/contest/402/problem/E 题意:给你一个矩阵a,判断是否存在k,使得a^k这个矩阵全部元素都大于0 分析:把矩阵当作01矩阵,超过1 ...
 - CF402E Strictly Positive Matrix 传递闭包用强连通分量判断
		
题目链接:http://codeforces.com/problemset/problem/402/E /**算法分析: 这道题考察了图论基本知识,就是传递闭包,可以构图用强联通分量来判断 */ #i ...
 - Codeforces Round #236 (Div. 2)E. Strictly Positive Matrix(402E)
		
E. Strictly Positive Matrix You have matrix a of size n × n. Let's number the rows of the matrix f ...
 - Kosaraju算法---强联通分量
		
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组). 算法描叙: :对 ...
 - UVa 11324 & 强联通分量+DP
		
题意: 一张无向图,求点集使其中任意两点可到达. SOL: 强联通分量中的点要么不选要么全都选,然后缩点DAG+DP 记录一下思路,不想写了...代码满天飞.
 - BZOJ 1051 & 强联通分量
		
题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双 ...
 - 洛谷 P2661 信息传递 Label:并查集||强联通分量
		
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
 - POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)
		
题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...
 - POJ 1904 King's Quest 强联通分量+输入输出外挂
		
题意:国王有n个儿子,现在这n个儿子要在n个女孩里选择自己喜欢的,有的儿子可能喜欢多个,最后国王的向导给出他一个匹配.匹配有n个数,代表某个儿子和哪个女孩可以结婚.已知这些条件,要你找出每个儿子可以和 ...
 
随机推荐
- xBIM 基础14 使用LINQ实现最佳性能(优化查询)
			
系列目录 [已更新最新开发文章,点击查看详细] LINQ代表语言集成查询,它是3.5版以来的.NET Framework的一部分.它实现延迟执行,这意味着您可以链接查询语句,并且在您实际迭代结 ...
 - 洛谷P1339 [USACO09OCT]热浪Heat Wave(最短路)
			
题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...
 - Android  Handling back press when using fragments in Android
			
In MainActivity: getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTw ...
 - Codeforces 845A. Chess Tourney  思路:简单逻辑题
			
题目: 题意:输入一个整数n,接着输入2*n个数字,代表2*n个选手的实力. 实力值大的选手可以赢实力值小的选手,实力值相同则都有可能赢. 叫你把这2*n个选手分成2个有n个选手的队伍. ...
 - hiho1080 - 数据结构 线段树(入门题,两个lazy tag)
			
题目链接 维护区间和,两个操作:一个是将某个区间设置成一个值,一个是将某个区间增加一个固定值 /**************************************************** ...
 - php时间差方法
			
/** * 时间差计算 * * @param Timestamp $time * @return String Time Elapsed */ function time2Units ($time,$ ...
 - 叁、js中的css
			
一.子选择器:用来选择一个父元素直接的子元素,不包括子元素的子元素,它的符号为“>” 注:ie6不支持子代选择器. <!DOCTYPE html PUBLIC "-//W3C// ...
 - vue的表格加单选框
			
https://www.cnblogs.com/calamus/p/8569196.html
 - PHP十六个魔术方法
			
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...
 - C++ vector基本用法
			
转自金河http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html 1 基本操作 (1)头文件#include<vector> ...