思路:
这题刚开始看上去,很屌,真的。
如果用很图论的做法,就很牛逼了。
首先要把环合并为一点,然后就变成了有向无环图,然后可能用拓扑排序之类的手段解决它。
这个很难很难,反正以哥的智商是没可能想出来的。
考虑了一下,只要每头牛为起始点遍历一下图,然后统计每个点上有多少头牛能过经过就行了。
复杂度 O(NK) 还是能过的。所以就瞬间沦为一道水题了。
后来代码写出来,太爽啦 0MS,这题哥的代码是第一!
#include <stdio.h>
#define MAX_N 1024
#define MAX_E 10032
struct edge_node {
struct edge_node *next;
int b;
};
struct vetx_node {
struct edge_node *e;
int cows, degs;
};
struct edge_node edges[MAX_E];
struct vetx_node vetxs[MAX_N];
int K, N, M;
int vis[MAX_N], tm;
int queue[MAX_N], head, tail;
inline void push(int i, int d)
{
if (vis[i] == tm)
return ;
vis[i] = tm;
vetxs[i].degs += d;
queue[tail++] = i;
}
inline void pop(int *i)
{
*i = queue[head++];
}
inline void bfs(int i)
{
int d;
struct edge_node *e;
d = vetxs[i].cows;
tm++;
head = tail = 0;
push(i, d);
while (head != tail) {
pop(&i);
for (e = vetxs[i].e; e; e = e->next)
push(e->b, d);
}
}
int main()
{
int i, a;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d%d%d", &K, &N, &M);
for (i = 0; i < K; i++) {
scanf("%d", &a);
vetxs[a].cows++;
}
for (i = 0; i < M; i++) {
scanf("%d%d", &a, &edges[i].b);
edges[i].next = vetxs[a].e;
vetxs[a].e = &edges[i];
}
for (i = 1; i <= N; i++)
if (vetxs[i].cows)
bfs(i);
a = 0;
for (i = 1; i <= N; i++)
if (vetxs[i].degs == K)
a++;
printf("%d\n", a);
return 0;
}