题目链接:点击打开链接
题目大意:在一树上的点集合『a,b,c』,使得没有simple path
分析:正向分析貌似很多种情况啊,所以想反面。
小菜鸟一枚啊,所以第一次T了啊TT。
这种DFS太暴力了,怎么会不T??附上代码,以示警告。
参考了下大神的代码,点击打开链接
仍用DFS,这次将3点看为一条线上的枚举中间这个点,但是两边的点完全有可能重复选择对方,所以最后/2。
刚才忘记打开栈开关了= =WA了
学习了打开栈开关
#pragma comment(linker, "/STACK:16777216")
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iostream>
#include<cstring>
using namespace std;
vector<int>node[100005];
bool visit[100005];
__int64 sum;
int n;
int dfs(int k)
{
int i,j,tmp,count=0;
visit[k]=true;
for(i=0;i<node[k].size();i++)
{
j=node[k][i];
if(!visit[j])
{
tmp=dfs(j);
count+=tmp;
sum+=(__int64 )tmp*(n-1-tmp);
}
}
if(count)
sum+=(__int64)count*(n-1-count);
count++;
return count;
}
int main()
{
int i,u,v,temp;
__int64 ans;
while(~scanf("%d",&n))
{
for(i=0;i<=n;i++)
node[i].clear();
memset(visit,false,sizeof(visit));
sum=0;
for(i=0;i<n-1;i++)
{
scanf("%d %d",&u,&v);
node[u].push_back(v);
node[v].push_back(u);
}
dfs(1);
ans=(__int64)n*(n-1)*(n-2)/6;//之前没有加(__int64)使得WA了= =
printf("%I64d\n",ans-(sum)/2);
}
return 0;
}