5037. 轮回
来源:互联网 发布:电脑简谱编辑器软件 编辑:程序博客网 时间:2024/04/28 17:23
题目大意
给定一个
Data Constraint
题解
对于一个点,如果我们只枚举与它相连的且度数严格大于它的点,复杂度是根号的,这个比较好证。
所以这题可以考虑先枚举一个环上的起点,再枚举与起点相连的每一个点,然后枚举比这个点度数大的点,统计答案即可。
时间复杂度:
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std ;#define N 100000 + 10typedef long long ll ;struct Note { int h , v ;} tp[N] ;vector < int > G[N] ;int Node[2*N] , Next[2*N] , Head[N] , tot ;int R[N] , Rank[N] , flag[N] , Cnt[N] ;int n , m ;ll ans ;bool cmp( Note a , Note b ) { return a.v > b.v ; }void link( int u , int v ) { Node[++tot] = v ; Next[tot] = Head[u] ; Head[u] = tot ;}int main() { freopen( "palingenesis.in" , "r" , stdin ) ; freopen( "palingenesis.out" , "w" , stdout ) ; scanf( "%d%d" , &n , &m ) ; for (int i = 1 ; i <= m ; i ++ ) { int u , v ; scanf( "%d%d" , &u , &v ) ; link( u , v ) ; link( v , u ) ; R[u] ++ , R[v] ++ ; } for (int i = 1 ; i <= n ; i ++ ) tp[i].h = i , tp[i].v = R[i] ; sort( tp + 1 , tp + n + 1 , cmp ) ; for (int i = 1 ; i <= n ; i ++ ) Rank[i] = tp[i].h ; for (int i = 1 ; i <= n ; i ++ ) { for (int p = Head[i] ; p ; p = Next[p] ) { if ( Rank[Node[p]] > Rank[i] ) continue ; G[i].push_back( Node[p] ) ; } } for (int x = 1 ; x <= n ; x ++ ) { for (int p = Head[x] ; p ; p = Next[p] ) { int now = Node[p] ; for (int i = 0 ; i < (signed)G[now].size() ; i ++ ) { int k = G[now][i] ; if ( Rank[k] >= Rank[x] ) continue ; if ( flag[k] != x ) { Cnt[k] = 0 ; flag[k] = x ; } ans += Cnt[k] ; Cnt[k] ++ ; } } } printf( "%lld\n" , ans ) ; return 0 ;}
以上.
0 0
- 5037. 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 轮回
- 人事轮回
- 三年轮回
- 大雁轮回
- 轮回殇
- 2015062606 - 轮回
- 挈轮回
- 轮回 序
- 生命的轮回
- 字符串相关(字符串数组,字符串处理相关函数、自实现函数)
- MySQL权限管理
- 镜头的由远到近的镜头拉近效果实现
- SPOJ Ada and Field
- maven报错:Non-resolvable parent POM for com.taotao:Taotao-common:0.0.1-SNAPSHOT: Could not find artifa
- 5037. 轮回
- MySQL数据备份
- POJ
- 动态规划面试题
- 第六周
- linux的Clone()函数详解
- Iterator 集合的迭代
- JavaScript基础语法介绍
- 混合硬盘装双系统