DFS 80分求助(已加入适当注释)
查看原帖
DFS 80分求助(已加入适当注释)
346134
hdkghc楼主2021/10/25 07:20
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
int Star[10001];	//是否为明星
int n, m;
	//建立邻接表//
struct edge
{
    int to, next;
}e[50001];
int v[10001];
int cnt;
int read()	//快读
{
    int x = 0, f = 1;
    char c = getchar();
    while(! isdigit(c))
    {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
void add(int from, int to)//添加有向边到邻接表里
{
    e[++cnt].to = to;
    e[cnt].next = v[from];
    v[from] = cnt;
}
bool visited[10001]; //是否经过数组
int Vcnt;
void dfs(int now, int start)
{
    int p = v[now];
    visited[now] = true;
    if(Vcnt == n)
        return;
    if(Star[now])    //如果被一只明星奶牛喜欢,那么这只奶牛就是明星奶牛
    {
        Star[start] = true;
        Vcnt = n;
        return;
    }
    Vcnt++;
    for(; p; p = e[p].next)		//遍历所有粉丝
    {
        int q = e[p].to;
        if(!visited[q]) dfs(q, start);
    }
}
int StarCowCount = 0;
int main()
{
    n = read();
    m = read();
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        x = read();
        y = read();
        add(y, x);
    }
    // 下面这个不要了,它会低分
    /*
    bool flag = false;
    for(int i = 1; i <= n; ++i)
    {
        if(v[n])
        {
            flag = true;
            break;
        }
    }
    if (flag == true){
        printf("0");
        return 0;
    }*/
    for(int i = 1; i <= n; i++)
    {
        dfs(i, i);
        if(Vcnt == n)
        {
            StarCowCount++;
            Star[i] = true;
        }
        Vcnt = 0;
        for(int i = 1; i <= n; i++)   //应该更高效一点。。。
        {
            if(visited[i]) visited[i] = 0;
        }
        // memset(visited, 0, sizeof(visited)); // 40004个byte
    }
    printf("%d", StarCowCount);
    return 0;
}
2021/10/25 07:20
加载中...