这份程序应该能被hack掉吧
查看原帖
这份程序应该能被hack掉吧
708963
WaterSky楼主2024/7/17 14:43

这是我自己的程序:

#include<bits/stdc++.h>
using namespace std;
vector<long long>G[2000010];
stack<long long>s;
long long dfn[2000010],low[2000010],cnt;
long long used[2000010],vis[2000010];
long long color[1000001],num[2000010],colornum;
long long n,m,p;
long long Ans[2000010],anS[2000010],ans=1e8,ANS;
void paint(long long x){s.pop(),color[x]=colornum,num[colornum]++,vis[x]=0;}
void tarjan(long long x)
{
	Ans[x]=anS[x]=1e8;
    dfn[x]=low[x]=++cnt,s.push(x),vis[x]=used[x]=1;
    for(int i=0;i<G[x].size();i++)
    {
        int q=G[x][i];
        if(!dfn[q]) tarjan(q),low[x]=min(low[x],low[q]);
        else if (vis[q]) low[x]=min(low[x],dfn[q]);
    }
    if (low[x]==dfn[x]){
        colornum++;
        while(s.top()!=x){
            int t=s.top();
            paint(t);
        }
        paint(x);
    }
}

long long Us[2000010];
bool bJ[2000010];
bool BJ;
int main()
{
    cin>>n;
	cin>>p;
	for(int i=1;i<=p;i++)
	{
		int x,y;
		cin>>x>>y;
		bJ[x]=1,Us[x]=y;
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		G[x].push_back(y);
	}
    for(int i=1;i<=n;i++)
        if (!used[i]) tarjan(i);
    for(long long i=1;i<=n;i++)
    {
    	anS[color[i]]=min(anS[color[i]],i);
    	if(bJ[i] || !Ans[color[i]]){
			Ans[color[i]]=min(Ans[color[i]],Us[i]);
    		for(int j=0;j<G[i].size();j++){
    			int v=G[i][j];
				if(color[v]!=color[i]) Ans[color[v]]=0;
    		}
    	}
    }
    for(int i=1;i<=colornum;i++)
    {
    	if(Ans[i]==1e8) BJ=1,ans=min(ans,anS[i]);
		else ANS+=Ans[i];
    }
    if(!BJ) cout<<"YES"<<endl<<ANS;
    else cout<<"NO"<<endl<<ans;
	return 0;
}

并且老师说这题数据不严谨,所以说......

hack 拿来!

2024/7/17 14:43
加载中...