Problem
A directed tree is a directed graph such that if all edges were undirected, this graph would be a tree. A rooted directed tree is a directed tree in which there is one vertex (the root, let's denote it by ) such that it is possible to reach all vertices of the graph from by moving along the directed edges.
You are given a directed tree with vertices (numbered through ). You may perform the following operation on it any number of times (including zero):
- Choose some edge which currently exists in the graph.
- Remove this edge.
- Add a new edge in such a way that the graph becomes a directed tree again.
What is the smallest number of operations which need to be performed in order to make the directed tree rooted?
Input
- The first line of the input contains a single integer denoting the number of test cases. The description of test cases follows.
- The first line of each test case contains a single integer .
- Each of the next lines contains two space-separated integers and denoting that there is a directed edge from to in the tree.
Output
For each test case, print a single line containing one integer ― the smallest number of operations we need to perform to create a rooted directed tree.
Constraints
- the graph described on the input is a directed tree
- the sum of over all test cases does not exceed
Subtasks
Subtask #1 (20 points): for each edge, or (the graph is a directed star)
Subtask #2 (80 points): original constraints
Sample 1:
2 3 1 2 3 2 3 1 2 2 3
1 0
Explanation:
Example case 1: We can delete the edge from vertex to vertex and insert an edge from to . Then, the graph becomes a rooted directed tree with vertex as the root. However, there are many other possible solutions.
Example case 2: The graph is already a rooted directed tree; the root is vertex .
Program :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int comp(const void *p,const void *q)
{
if(*(long int *)p-*(long int *)q>0)
return 1;
else
return -1;
}
int main(void) {
// your code goes here
int t,u,v,n,arr[10000],i,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<=n;i++)
arr[i]=0;
for(i=1;i<n;i++)
{
scanf("%d %d",&u,&v);
arr[v]++;
}
ans=-1;
for(i=1;i<=n;i++)
if(arr[i]==0)
ans++;
printf("%d\n",ans);
}
return 0;
}
0 Comments