http://codeforces.com/contest/659/problem/E
题意:n个点中存在m条无向边,如果在这m条边加上方向,方向唯一,但是可以是任意的,求入度为0的点的个数最多是多少
思路:循环搜索每一个点,如果存在环,则环内的点入度都不为0,环外的点如果能由环内的点到达,则入度不为0
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
#define N 110000
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define MOD 1000000007
#define met(a, b) memset (a, b, sizeof(a))
const double EPS = 1e-8;
vector <vector <int> > G;
int n, m, vis[N], k;
void DFS (int u, int v)
{
if (vis[u])
{
k = 0;
return;
}
vis[u] = 1;
for (int i=0; i<G[u].size(); i++)
{
if (G[u][i] != v)
DFS (G[u][i], u);
}
}
int main ()
{
while (scanf ("%d %d", &n, &m) != EOF)
{
G.clear();
G.resize (n+1);
met (vis, 0);
while (m--)
{
int a, b;
scanf ("%d %d", &a, &b);
G[a].push_back (b);
G[b].push_back (a);
}
int ans = 0;
for (int i=1; i<=n; i++)
{
if (vis[i]) continue;
k = 1;
DFS (i, 0);
ans += k;
}
printf ("%d\n", ans);
}
return 0;
}