codeforces 402E - Strictly Positive Matrix【tarjan】

首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数

所以可以把矩阵当成邻接矩阵,全是>0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染色,如果只有一个色块的话就是YES否则都是NO(其实应该能更简单一些,不过tarjan比较顺手)

还有就是我没仔细看题判了对角巷为0就NO结果WA……

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2005;
int n,h[N],cnt,low[N],dfn[N],tot,s[N],top,col;
bool v[N];
bool f;
struct qwe
{
    int ne,to;
}e[N*N];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
void tarjan(int u)
{
    dfn[u]=low[u]=++tot;
    v[s[++top]=u]=1;
    for(int i=h[u];i;i=e[i].ne)
    {
        if(!dfn[e[i].to])
        {
            tarjan(e[i].to);
            low[u]=min(low[u],low[e[i].to]);
        }
        else if(v[e[i].to])
            low[u]=min(low[u],dfn[e[i].to]);
    }
    if(dfn[u]==low[u])
    {
        col++;
        while(s[top]!=u)
            v[s[top--]]=0;
        v[s[top--]]=0;
    }
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int x=read();
            if(i!=j&&x)
                add(i,j);
        }
    for(int i=1;i<=n;i++)
        if(!dfn[i])
            tarjan(i);
    if(col==1)
        puts("YES");
    else
        puts("NO");
    return 0;
}

原文地址:https://www.cnblogs.com/lokiii/p/9277076.html

时间: 2024-12-28 18:31:34

codeforces 402E - Strictly Positive Matrix【tarjan】的相关文章

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 from 1 to n from top to bottom, let's number the columns from 1 ton from left to right. Let's use aij to represent the element on the intersection of the

POJ 1904:King&#39;s Quest【tarjan】

题目大意:给出一个二分图的完美匹配(王子和公主的烧死名单表),二分图x部和y部均只有n个点,问对于每一个x部的点,他能选择哪些点与之匹配 使得与之匹配后,剩余图的最大匹配仍然是n 思路:这题是大白书379页二分图的压轴题,在图论刷的题还不多时思考过这题,现在想来也不难想 这题引人瞩目的一点便是预先给出了一个二分图的初始匹配 对每个点枚举后增广显然不怎么可行,那么还是图论问题的经典思考方式,点和边各表示什么 题目的输入天然的给出了一个图,但对这题好像没什么用处,于是开始思考把给出的初始匹配的每条边

【tarjan】BZOJ2140-稳定婚姻

又名NTR的故事 [题目大意] n对夫妻Bi和Gi.若某男Bi与某女Gj曾经交往过,他们有私奔的可能性.不妨设Bi和Gj旧情复燃,进而Bj会联系上了他的初恋情人Gk,以此递推.若在Bi和Gi离婚的前提下,这2n个人最终依然能够结合成n对情侣,那么我们称婚姻i为不安全的,否则婚姻i就是安全的.问n对夫妻的婚姻分别是安全的吗? [思路] 第一反应是匈牙利算法,但是太过于暴力了,过不了. 我们把夫妻中女方连向男方,旧情中男方连向女方.可以得出结论:如果该有向图的强连通分量中,夫妻双方在同一个强连通分量

Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】

任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Let's call some square matrix with integer values in its cells palind

codeforces 400 C Inna and Huge Candy Matrix【模拟】

题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include

Codeforces 999D Equalize the Remainders 【数据结构】【贪心】

考场的时候想到的n*m做法tle了,正解是O(n+m) 首先想到一个性质是不管a[i],a[j]相差多少,只要a[i],a[j]同余,那想让他们increase后%m得到另一个余数,那他们需要increse的次数是相等的. 所以我们想到把n个数按%m从0到m-1分成m类.这样就能贪心了,因为如果%m为0这样的数大于n/m个,那这样说明这里面的v.size()-n/m个数至少要加1,我们把这些多出来的%m为0的数转化成%m为1的数:如果小于n/m先不处理.一遍扫完我们发现m-1这一项会有很多数(因

第48套题【tarjan】【图&amp;树的连通性】【并查集】

Problem 1 图的连通性??题目背景??琼和雪不知从什么时候就开始形影不离得呆在一起,无话不说了那天她们在谈论图论??题意描述??“有一个无向图,每次断掉一条边,并询问两个点时候联通,你会维护么?” 琼很认真地问.“为什么要知道这个呢?”“我们总要知道自己是否身陷囹囵……你必须立刻告诉我答案哦”??输入格式??测试数据的第一行是三个正整数n.m.t, 表示无向图有n 个点,m 条边和t 个操作接下来m 行,每行两个正整数x.y,表示x 和y 之间有一条边(允许存在重边)接下来t 行,每行三

POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &l

【tarjan】BZOJ 1051:受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1642[Submit][Status][Discuss] Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. Inp