JZOJ4857. Tourist Attractions

题目大意

给定一个 n 个点的无向图,求这个图中有多少条长度为4的简单路径。

Data Constraint
n1500

题解

假设有一条路径 abcd 考虑枚举两个中间点 c,d ,那么最后它们对答案的贡献就是 (tot[c]1)×(tot[d]1)|ScSd| tot 是和它相邻的点的数量, S 是和它相邻的点的集合。
现在的问题是要计算交集的大小,可以用二进制表示+压位来处理。当然也可以用bitset。

SRC

#include
#include
#include
#include
#include
#include
using namespace std ;

#define N 1500 + 10
#define M 4000000 + 10
typedef long long ll ;

bitset < N > S[N] , P ;

int Node[M] , Next[M] , Head[N] , tot ;
int Son[N] ;
int n ;
ll ans ;

void link( int u , int v ) {
    Node[++tot] = v ;
    Next[tot] = Head[u] ;
    Head[u] = tot ;
}

int main() {
    freopen( "tour.in" , "r" , stdin ) ;
    freopen( "tour.out" , "w" , stdout ) ;
    scanf( "%d" , &n ) ;
    for (int i = 1 ; i <= n ; i ++ ) {
        scanf( "\n" ) ;
        for (int j = 1 ; j <= n ; j ++ ) {
            char c ;
            scanf( "%c" , &c ) ;
            if ( c == '1' ) link( i , j ) , Son[i] ++ , S[i][j] = 1 ;
        }
    }
    for (int i = 1 ; i <= n ; i ++ ) {
        for (int p = Head[i] ; p ; p = Next[p] ) {
            ans += (ll)(Son[i] - 1) * (Son[Node[p]] - 1) ;
            P = S[i] & S[Node[p]] ;
            ans -= P.count() ;
        }
    }
    printf( "%lld\n" , ans ) ;
    return 0 ;
}

以上.

你可能感兴趣的:(STL)