54 pts 求调
  • 板块P1262 间谍网络
  • 楼主simonG
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/21 10:52
  • 上次更新2023/10/23 20:57:54
查看原帖
54 pts 求调
253936
simonG楼主2023/3/21 10:52
#include<bits/stdc++.h>
using namespace std;
const int N=4010,M=10010,inf=2e9;
int n,m,p,o[N],head[N],nxt[2*M],ver[2*M],tot;
int dfn[N],low[N],num;
int stk[N],ins[N],tp,c[N],val[N],scc;
int hc[N],nc[2*M],vc[2*M],tc,ind[N];
int ans=0;
void addedge(int x,int y) {
	ver[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
void add_c(int x,int y) {
	vc[++tc]=y;
	nc[tc]=hc[x];
	hc[x]=tc;
}
void tarjan(int u) {
	dfn[u]=low[u]=++num;
	stk[++tp]=u; ins[u]=1;
	for(int i=head[u]; i; i=nxt[i]) {
		int v=ver[i];
		if(!dfn[v]) {
			tarjan(v);
			low[u]=min(low[u],low[v]);
		} else if(ins[v]) {
			low[u]=min(low[u],dfn[u]);
		}
	}
	if(dfn[u]==low[u]) {
		scc++; int z;
		do {
			z=stk[tp--]; ins[z]=0;
			c[z]=scc; val[scc]=min(val[scc],o[z]);
		} while(u!=z);
	}
}
int main() {
	scanf("%d%d",&n,&p);
	for(int i=1; i<=n; i++) o[i]=inf;
	for(int i=1,u,w; i<=p; i++) {
		scanf("%d%d",&u,&w);
		o[u]=w;
	}
	scanf("%d",&m);
	for(int i=1,u,v; i<=m; i++) {
		scanf("%d%d",&u,&v);
		addedge(u,v);
	}
	for(int i=1; i<=n; i++) val[i]=inf;
	for(int i=1; i<=n; i++) {
		if(!dfn[i]&&o[i]!=inf) tarjan(i);
	}
	for(int i=1; i<=n; i++) {
		if(!dfn[i]) {
			printf("NO\n%d\n",i);
			return 0;
		}
	}
	for(int u=1; u<=n; u++) {
		for(int i=head[u]; i; i=nxt[i]) {
			int v=ver[i];
			if(c[u]==c[v]) continue;
			add_c(c[u],c[v]);
			ind[c[v]]++;
			e[c[v]].push_back(c[u]); 
		}
	}
//	for(int i=1; i<=scc; i++) {
//		printf("scc#%d:%d ind = %d\n",i,val[i],ind[i]);
//		for(int j=0; j<e[i].size(); j++)
//			printf("%d ",e[i][j]);
//		puts("");
//	}	
	for(int i=1; i<=scc; i++) 
		if(ind[i]==0) ans=ans+val[i];
	printf("YES\n%d\n",ans); 
	return 0;
}
2023/3/21 10:52
加载中...