蒟蒻在线求助
  • 板块灌水区
  • 楼主Zhu_Ziyu
  • 当前回复24
  • 已保存回复24
  • 发布时间2022/7/14 15:44
  • 上次更新2023/10/27 20:23:23
查看原帖
蒟蒻在线求助
665925
Zhu_Ziyu楼主2022/7/14 15:44

**有没有大佬帮我这个蒟蒻看看P1262 间谍网络这道题,数据是我们学校oj的数据,卡了半天了就是memset有问题。 **

#include <bits/stdc++.h>
using namespace std;
int n,p,r;
int tot,cnt;
vector <int> G[10005];
int dfn[10005],low[10005],scc[10005],in[10005],sum[10005];
int spy[10005];
bool instack[10005];
stack <int> stk;
void Tarjan(int u){
	dfn[u]=++tot;
	low[u]=dfn[u];
	stk.push(u);
	instack[u]=true;
	int size=G[u].size();
	for(int i=0;i<size;i++){
		int v=G[u][i];
		if(dfn[v]==0){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(instack[v]==true){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		scc[u]=++cnt;
		while(stk.top()!=u){
			int x=stk.top();
			scc[x]=cnt;
			instack[x]=false;
			stk.pop();
		}
		instack[u]=false;
		stk.pop();
	}
}
int main(){
	scanf("%d %d",&n,&p);
//90分	
//	memset(spy,0x7f7f7f,sizeof(spy));
//	memset(sum,0x7f7f7f,sizeof(sum));

//72分 
//	memset(spy,0x7f7f7f,n);
//	memset(sum,0x7f7f7f,sizeof(sum));	
	for(int i=1;i<=p;i++){
		int name,money;
		scanf("%d %d",&name,&money);
		spy[name]=money;
	}
	scanf("%d",&r);
	for(int i=1;i<=r;i++){
		int a,b;
		scanf("%d %d",&a,&b);
		G[a].push_back(b);
	}
	for(int i=1;i<=n;i++){
//90分 
//		if(dfn[i]==0&&spy[i]!=0x7f7f7f){
//			Tarjan(i);
//		}

//72分
//		if(dfn[i]==0&&spy[i]!=0x7f7f7f){
//			Tarjan(i);
//		} 
	}
	for(int i=1;i<=n;i++){
		if(dfn[i]==0){
			printf("NO\n");
			printf("%d",i);
			return 0;	
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		int size=G[i].size();
		for(int j=0;j<size;j++){
			int v=G[i][j];
			if(scc[i]!=scc[v]){
				in[scc[v]]++;
			}
		}
	}
	for(int i=1;i<=n;i++){
		sum[scc[i]]=min(sum[scc[i]],spy[i]);
	}
	for(int i=1;i<=cnt;i++){
		if(in[i]==0){
			ans+=sum[i];
		}
	}
	printf("YES\n");
	printf("%d",ans);
	return 0;
}
2022/7/14 15:44
加载中...