求助!!90分,第一个点错了
查看原帖
求助!!90分,第一个点错了
187923
liuyanxi2楼主2020/7/20 09:32
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<cmath>
#include<stack>
using namespace std;
int ans1,a,b,c,d,e,f,g,m,n,z,x,k1[500001],k2[500001],l,o,opt,head[500001],cnt,ans,ans2,dfn[500001],low[500001],mjc,vis[500001],ma[500001],in[500001],out[500001],s[100001],s1[100001],s2[100001];
stack <int >p;
void ab(int q,int w)
{
    cnt++;
    k1[cnt]=head[q];
    k2[cnt]=w;
    head[q]=cnt;
}

void tarjin(int q)
{
    int w;
    dfn[q]=low[q]=++mjc;
    p.push(q);
    vis[q]=1;
    for(int i=head[q];i!=0;i=k1[i])
    {
        w=k2[i];
        if(dfn[w]==0)
        {
            tarjin(w);
            low[q]=min(low[q],low[w]);
        }
        else
        if(vis[w])
        low[q]=min(low[q],dfn[w]);
    }
    if(low[q]==dfn[q])
    {
		ans++;
        while(q!=w)
        {
            w=p.top();
            p.pop();
            vis[w]=0;
            ma[w]=ans;
        }
    }
}
int main ( )
{
    cin>>n;
    for(int i=1;i<=n;i++)
    scanf("%d",&s[i]);
    cin>>m;
    for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&b,&c);
		if(b!=c)
		ab(b,c);
	}
    for(int i=1;i<=n;i++)
    if(!dfn[i])
    tarjin(i);
  	for(a=1;a<=n;a++)
  	{
  		x=head[a];
  		if(s1[ma[a]]==0)
  		s1[ma[a]]=s[a],s2[ma[a]]++;
  		else
  		{
  			if(s1[ma[a]]==s[a])
  			s2[ma[a]]++;
  			if(s1[ma[a]]>s[a])
  			s2[ma[a]]=1,s1[ma[a]]=s[a];
  		}
  	}
  	ans1=0;ans2=1;
  	for(a=1;a<=ans;a++)
  	{
  		ans1+=s1[a];
  		ans2*=s2[a];
  	}
  	if(ans1!=0)
	cout<<ans1<<' '<<ans2;
	else
	cout<<0<<' '<<0;
    return 0 ;
}
2020/7/20 09:32
加载中...