度数

 

Game map

图论 + 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 }

 

posted @ 2021-04-11 19:22  彦辰kkkkk  阅读(191)  评论(0)    收藏  举报