POJ--3567[Cactus Reloaded] 求仙人掌树的直径

 

题目大意:

给一棵仙人掌(就是所有的边都在至多一个环中的图),求仙人掌的直径,也就是最短路径最长的一对点的最短路径。

思路:

 

/*无向图的连通性*/
/*
思路:
(1):一遍dfs,遇到割点执行Judge()
(2):遇到割点时栈(存边)里面的图形只可能是1.长度为1的线段;2.一个圆环。
(3):缩点之前还要对W[u]大于1的那些点进行两两组合更新答案
*/

 

PS.

Discuss里说要用树形DP+单调队列优化,表示这两个都不太会,结果就暴力了点,发现也能过、

 

CODE:

 

/*AC代码:1188ms*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAXN 50005
#define INF 1e8
#define min(a,b) (ab?a:b)
using namespace std;
struct Node
{
	int w,p;
}node[MAXN];
int vcnt;
struct edge
{
	int u,v,id,next;
}E[500000];
int head[MAXN],ecnt;
int low[MAXN],dfn[MAXN],col[MAXN],dis[MAXN];
int W[MAXN];//每个点的权值
int t[MAXN];
bool vis[MAXN];
int N,M,Index,ans,root;
void Insert(int u,int v)
{
	E[ecnt].u=u;
	E[ecnt].v=v;
	E[ecnt].id=ecnt;
	E[ecnt].next=head[u];
	head[u]=ecnt++;
}
void Init()
{
	int i,j,u,v,w;
	memset(head,-1,sizeof(head));ecnt=0;
	for(i=1;i<=M;i++)
	{
		scanf("%d",&w);
		scanf("%d",&u);
		for(j=2;j<=w;j++)
		{
			scanf("%d",&v);
			Insert(u,v);
			Insert(v,u);
			u=v;
		}
	}
	/*
	for(i=0;iw-((struct Node *)p1)->w;
}
stack_S;
void Run(int n)
{
	int i,j,p1,p2;
	for(i=0;i


 

 

你可能感兴趣的:(POJ,图论)