cf#338-B - Longtail Hedgehog-dag_dp

http://codeforces.com/contest/615/problem/B


题意 给你一个图,不一定联通

n=1e5,m=2e5

符合题意的一条路 是 从头到尾 每个节点都是递增的。 如 1 - 2 -5合法  1 - 5 -4不合法

求最大的ans值  ,ans值等于某条合法路径的节点数 乘上  【整个图】 与末尾端点的连接的点的个数  如 1- 2 -5 ,如果5共有3个点与其相连,那么这条路的ans=3*3=9;


直接dfs肯定会超时啦。 

我们只需要求出  以每个节点 为【末尾端点】时,所在路径的长度,然后ans值就可以直接得到了


在dfs过程中  用个dp数组,dp[x]记录点x为结束端点的时候 所在路径长度。

注意,如果dfs是按 递增的顺序走的话,不好得到以x为结束端点的长度,我们可以  反过来玩,按递减的顺序走,得到的dp[x]便是我们所要的了。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#include <iostream>
using namespace std; 
__int64 min(__int64 a,__int64 b){return a<b?a:b;}
__int64 max(__int64 a,__int64 b){return a>b?a:b;}

vector<__int64> tm[100005];
__int64 dp[200005];
__int64 dfs(__int64 x )
{
	if (dp[x]) return dp[x];
	dp[x]=1;
	for(__int64 i=0;i<tm[x].size();i++)
	{
		if (tm[x][i]>x)continue;  		 //递减地走
		dp[x]=max(dp[x],dfs(tm[x][i])+1);
	}
	return dp[x];
}

int main()
{
	__int64 i,j,k;
	__int64 n,m; 
	__int64 tmp,tt;
	__int64 t1,t2;
	scanf("%I64d%I64d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%I64d%I64d",&t1,&t2);  
		tm[t1].push_back(t2); 
		tm[t2].push_back(t1); 
	}
	__int64 maxx=0;
	for(i=1;i<=n;i++)
	{  
			 maxx=max(maxx,dfs(i )*tm[i].size());  
	}
	
	printf("%I64d\n",maxx); 
	
	return 0;
	
}


你可能感兴趣的:(cf#338-B - Longtail Hedgehog-dag_dp)