10-13wa了,84分。。
查看原帖
10-13wa了,84分。。
271012
17634807556lx楼主2022/10/25 10:35
//001:Popular Cows
#include<iostream>
#include<stack>
#include<vector>
#include<set>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX=10005;

vector<vector<int>> G(MAX);
stack<int> st;
int dfn[MAX];
int low[MAX];
int instack[MAX];
int tim=1;
int colornum=1;
int color[MAX];
int num[MAX];
void dfs(int x){
    dfn[x]=tim;
    low[x]=tim++;
    st.push(x);
    instack[x]=1;
    for(auto i :G[x]){
        if(dfn[i]==0){
            dfs(i);
            low[x]=min(low[x], low[i]);
        }
        else if(instack[i])
            low[x]=min(low[x],dfn[i]);
    }
    if(dfn[x]==low[x]){
        int tmp=st.top();st.pop();
        color[tmp]=colornum;
        num[colornum]++;
        // cout<<"强连通:"<<tmp<<' ';
        while(tmp!=x){
            tmp=st.top();st.pop();
            color[tmp]=colornum;
            num[colornum]++;
            //cout<<tmp<<' ';
        }
        colornum++;
    }
}

int main(){
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(instack,0,sizeof(instack));
    memset(num,0,sizeof(num));
    int n,m;cin>>n>>m;
    for(int i=0;i<m;++i){
        int x,y;
        cin>>x>>y;
        G[x-1].push_back(y-1);
    }
    for(int i=0;i<n;++i){
        if(dfn[i]==0)
        dfs(i);
    }
    int flag[colornum];
    //cout<<"color num "<<colornum<<'\n';
    memset(flag,0,sizeof(flag));
    for(int i=0;i<n;++i){
        for(auto j:G[i]){
            if(color[i]!=color[j]){
                flag[color[i]]=1;
            }
        }
    }
    int count=0;
    int ans=0;
    for(int i=1;i<colornum;++i){
        if(flag[i]==0){
            count++;
            ans+=num[i];
        }
    }
    if(count==1) cout<<ans;
    else{
        cout<<0;
    }
}
2022/10/25 10:35
加载中...