小蒟蒻打缩点90pts,Wa第一个点
  • 板块灌水区
  • 楼主MuYC
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/12/4 15:12
  • 上次更新2023/11/5 06:44:09
查看原帖
小蒟蒻打缩点90pts,Wa第一个点
67817
MuYC楼主2020/12/4 15:12

RT

有人Wa过第一个点吗...

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10004 , MAXM = 200005;
int start[MAXN],cnt = 0,n,m;
int dfn[MAXN],low[MAXN],top = 0 , now = 0 , z = 0 , tack[MAXN],vis[MAXN],color[MAXN],siz[MAXN];
int dp[MAXN],val[MAXN];
int locked[MAXN];
map <pair<int,int>,int > mp;

struct Edge {
    int next,to,from;
} edge[MAXN],New[MAXM];

void add(int from,int to)
{
    cnt ++;
    edge[cnt].to = to;
    edge[cnt].next = start[from];
    start[from] = cnt;
    edge[cnt].from = from;
    return ;
}

inline int read()
{
    int x = 0 , flag = 1;
    char ch = getchar();
    for( ; ch > '9' || ch < '0' ; ch = getchar()) if(ch == '-')flag = -1;
    for( ; ch >= '0' && ch <= '9' ; ch = getchar()) x = (x << 3) + (x << 1) + ch - '0';
    return x * flag;
}

void tarjan(int x)
{
    dfn[x] = low[x] = ++now;
    top ++ , tack[top] = x , vis[x] = 1;
    for(int i = start[x] ; i ; i = edge[i].next)
    {
        int to = edge[i].to;
        if(!dfn[to])
        {
            tarjan(to);
            low[x] = min(low[x],low[to]);
        }
        else if(vis[to]) low[x] = min(low[x],dfn[to]);
    }
    if(dfn[x] == low[x])
    {
        z ++;
        while(tack[top + 1] != x)
        {
            color[tack[top]] = z;
            vis[tack[top]] = 0;
            siz[z] += val[tack[top]];
            top --;
        }
    }
    return ;
}

void topo()
{
    queue <int> q;
    for(int i = 1 ; i <= z ; i ++)
        if(locked[i] == 0) q.push(i),dp[i] = siz[i];
    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        for(int i = start[x] ; i ; i = edge[i].next)
        {
            int to = edge[i].to;
            locked[to] --;
            dp[to] = max(dp[to],dp[x] + siz[to]);
            if(locked[to] == 0)q.push(to);
        }
    }
}

int main()
{
    n = read() , m = read();
    for(int i = 1 ; i <= n ; i ++)
        val[i] = read();
    for(int i = 1 ; i <= m ; i ++)
    {
        int u = read() , v = read();
        add(u,v);
    }
    for(int i = 1 ; i <= n ; i ++)
    if(!dfn[i])tarjan(i);
    cnt = 0;
    memset(start,0,sizeof(start));
    for(int i = 1 ; i <= m ; i ++)
    {
        if(color[edge[i].to] == color[edge[i].from])continue;
        if(!mp[make_pair(edge[i].from,edge[i].to)])
        {
            add(color[edge[i].from] , color[edge[i].to]);
            locked[color[edge[i].to]] ++;
            mp[make_pair(edge[i].from,edge[i].to)] = 1;
        }
    }
    topo();
    int M = -1100;
    for(int i = 1 ; i <= z ; i ++)M = max(M,dp[i]);
    cout << M;
    return 0;
}
2020/12/4 15:12
加载中...