思路:
這題剛開始看上去,很屌,真的。
如果用很圖論的做法,就很牛逼了。
首先要把環合并為一點,然后就變成了有向無環圖,然后可能用拓撲排序之類的手段解決它。
這個很難很難,反正以哥的智商是沒可能想出來的。
考慮了一下,只要每頭牛為起始點遍歷一下圖,然后統計每個點上有多少頭牛能過經過就行了。
復雜度 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;
}
