度数
图论 + dp
题意:按度数(入度 出度)大小走,找最长的序列长度
核心部:
if(du[j] < du[u]) dist[u] = max(dist[u] , dist[j] + 1);
完整代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<algorithm> 6 7 using namespace std; 8 9 typedef pair<int,int> pII; 10 11 const int N = 1000010, INF = 0x3f3f3f3f; 12 13 int n,m; 14 int e[N],h[N],ne[N],idx; 15 int dist[N]; 16 int du[N]; 17 int a[N]; 18 int res; 19 20 struct node 21 { 22 int u , d; 23 24 }b[N]; 25 26 void add(int a,int b) 27 { 28 e[idx] = b,ne[idx] = h[a],h[a] = idx ++; 29 } 30 31 bool cmp(node x , node y) 32 { 33 return x.d < y.d; 34 } 35 36 int dfs(int u) 37 { 38 dist[u] = 1; 39 40 for(int i = h[u] ; i != -1 ; i = ne[i]) 41 { 42 int j = e[i]; 43 if(du[j] < du[u]) //把u插到j的后面 44 dist[u] = max(dist[u] , dist[j] + 1); 45 } 46 return dist[u]; 47 } 48 49 int main() 50 { 51 cin >> n >> m; 52 53 memset(h , -1 , sizeof h); 54 55 for(int i = 0 ; i < m ; i ++ ) 56 { 57 int a , b; 58 cin >> a >> b; 59 add(a , b); 60 add(b , a); 61 du[a] ++, du[b] ++; 62 } 63 64 for(int i = 0 ; i < n ; i ++ ) 65 { 66 b[i].u = i; 67 b[i].d = du[i]; 68 } 69 sort(b , b + n , cmp); 70 71 for(int i = 0 ; i < n ; i ++ ) 72 { 73 int x = b[i].u; 74 res = max(res , dfs(x)); 75 } 76 77 cout << res << endl; 78 79 return 0; 80 }


浙公网安备 33010602011771号