Round #435(Div.2) B. Mahmoud and Ehab and the bipartiteness(이분도 염색)
4887 단어 Codeforces이분도
A tree is a connected acyclic graph. A bipartite graph is a graph, whose vertices can be partitioned into 2 sets in such a way, that for each edge (u, v) that belongs to the graph, u and v belong to different sets. You can find more formal definitions of a tree and a bipartite graph in the notes section below.
Dr. Evil gave Mahmoud and Ehab a tree consisting of n nodes and asked them to add edges to it in such a way, that the graph is still bipartite. Besides, after adding these edges the graph should be simple (doesn’t contain loops or multiple edges). What is the maximum number of edges they can add?
A loop is an edge, which connects a node with itself. Graph doesn’t contain multiple edges when for each pair of nodes there is no more than one edge between them. A cycle and a loop aren’t the same .
Input The first line of input contains an integer n — the number of nodes in the tree (1 ≤ n ≤ 105).
The next n - 1 lines contain integers u and v (1 ≤ u, v ≤ n, u ≠ v) — the description of the edges of the tree.
It’s guaranteed that the given graph is a tree.
Output Output one integer — the maximum number of edges that Mahmoud and Ehab can add to the tree while fulfilling the conditions.
Examples input 3 1 2 1 3 output 0 input 5 1 2 2 3 3 4 4 5 output 2 Note Tree definition: https://en.wikipedia.org/wiki/Tree_(graph_theory)
Bipartite graph definition: https://en.wikipedia.org/wiki/Bipartite_graph
In the first test case the only edge that can be added in such a way, that graph won’t contain loops or multiple edges is (2, 3), but adding this edge will make the graph non-bipartite so the answer is 0.
In the second test case Mahmoud and Ehab can add edges (1, 4) and (2, 5). 나무 한 그루가 이분도를 구성할 수 있다는 전제에서 최대 몇 개의 선을 연결할 수 있고 여전히 이분도냐고 물었다.먼저 이분도를 염색하여 두 개의 집합으로 나누고 집합의 크기는 각각 s1, s2이다.최대 연결 개수는 s1*s2로 이미 연결된 것을 제거하기 때문에 답은 s1*s2-n+1입니다.s1, s2는 처음으로 int,wa를 사용했습니다.
#include
#include
#include
#include
#define LL long long
using namespace std;
const int maxn=100005;
vector<int> graph[maxn];
int vis[maxn];
LL s1,s2;
void dfs(int u,int c)
{
vis[u]=1;
if(c==1)s1++;// 1 -1
if(c==-1)s2++;
for(int i=0;iif(vis[graph[u][i]]==0)
{
vis[graph[u][i]]=1;
dfs(graph[u][i],-c);// ,
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
int u,v;
for(int i=0;i1;i++)
{
scanf("%d%d",&u,&v);
graph[u].push_back(v);
graph[v].push_back(u);
}
s1=0,s2=0;
dfs(1,1);
printf("%lld
",s1*s2-n+1);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces 1287C Garland제목 링크:Codeforces 1287C Garland 사고방식: 우리기dp[i][j][0]와 dp[i][j][1]는 각각 i개가 홀수/짝수이고 앞의 i개 안에 j개의 짝수가 있는 상황에서 i개의 최소 복잡도.첫 번...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.