1、4、5、7MLE 3WA 求助求助
查看原帖
1、4、5、7MLE 3WA 求助求助
1067565
lotus12154楼主2024/3/7 15:02
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
#define MAX_N 100
using namespace std;
int n,m;
struct edge
{
    int from,next;
};
vector<edge> a;
vector<edge> newa;
int dfn[MAX_N];
int low[MAX_N];
int vis[MAX_N];
int belong[MAX_N];
int stap[MAX_N];
int value[MAX_N];
int newvalue[MAX_N];
int dp[MAX_N]={0};
int stop=0,bcnt=0,dindex=0;
vector<int> b[MAX_N];
vector<int>newb[MAX_N];
void tarjan(int i)
{   dfn[i]=low[i]=++dindex;
    vis[i]=1;
    stap[++stop]=i;
    for(int j=0;j<b[i].size();j++)
    {
        if(dfn[b[i][j]]==0)
        {
            tarjan(b[i][j]);
            low[i]=min(low[i],low[b[i][j]]);
        }
        else if(vis[b[i][j]]&&dfn[b[i][j]]<low[i])
        {
            low[i]=dfn[b[i][j]];
        }        
    }
    int j;
    if(dfn[i]==low[i])
    {
        bcnt++;
        do{
             j=stap[stop--];
            vis[j]=0;
            belong[j]=bcnt;
        }
        while(i!=j);

    }
}

void dfs(int i)
{
    if(vis[i])return;
    for(int j=0;j<newb[i].size();j++)
    {   
        if(!vis[newb[i][j]])
        {   
               
            
            dfs(newb[i][j]);
            vis[newb[i][j]] =1;
        }
        dp[i]=max(dp[i],dp[newb[i][j]]+newvalue[i]);
    }
    
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>value[i];
    }
    for(int i=1;i<=m;i++)
    {
        int c,b;
        cin>>c>>b;
        a.push_back((edge){c,b});
    }
    for(int i=0;i<m;i++)
    {
        b[a[i].from].push_back(a[i].next);
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i])
        {   stop=dindex=0;
            tarjan(i);
        }
    }
    int newedge=0;
    for(int i=0;i<m;i++)
    {   if(belong[a[i].from]!=belong[a[i].next])
        {newedge++;
        newa.push_back((edge){belong[a[i].from],belong[a[i].next]});}
              
    }
    for(int i=0;i<newedge;i++)
    {
        newb[newa[i].from].push_back(newa[i].next);
    }
    for(int i=1;i<=n;i++)
    {
        newvalue[belong[i]]+=value[i];
    }
    for(int i=1;i<=bcnt;i++)
    {
        dp[i] = newvalue[i];
    }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=bcnt;i++)
    {   
        if(!vis[i])
        dfs(i);        
    }
    int ans=0;
    for(int i=1;i<=bcnt;i++)
    {
        ans = max(ans,dp[i]);
    }
    cout<<ans;
    system("pause");
}
第一组样例.in
10 20
970 369 910 889 470 106 658 659 916 964 
3 2
3 6
3 4
9 5
8 3
5 8
9 1
9 7
9 8
7 5
3 7
7 8
1 7
10 2
1 10
4 8
2 6
3 1
3 5
8 5
.out
6911
2024/3/7 15:02
加载中...