codeforces 615B. Longtail Hedgehog

题意:输入n,m表示n个点,m条边,求一条递增的序列的点数与末尾点连接的点个数的乘积最大值。

分析:dp跑一下,时间复杂度O(m)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <map>

using namespace std;

long long sum[100005];

long long dp[100005];
int head[100005];
struct node
{
    int v,next;
}G[200005];
int k=1;
void add(int u, int v)
{
    G[k].v = v;
    G[k].next = head[u];
    head[u] = k++;
}

int main()
{
    int n, m;
    int x, y;
    scanf("%d %d", &n, &m);

    for(int i=1; i<=m; i++)
    {
        scanf("%d%d", &x, &y);
        sum[x]++;
        sum[y]++;
        if(x<y)
            add(y,x);
        else
            add(x,y);
    }
    long long ans = 1;
    int v;
    for(int i=1; i<=n; i++)
    {
        dp[i] = 1;
        for(int j=head[i]; j!=0; j=G[j].next)
        {
            v = G[j].v;
            dp[i] = max(dp[v]+1, dp[i]);
        }
        ans=max(ans, sum[i]*dp[i]);
    }
    printf("%lld
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/mengzhong/p/5476990.html