loj & 本地 AC,洛谷 WA #6,求助
查看原帖
loj & 本地 AC,洛谷 WA #6,求助
422684
M1saka16I72楼主2024/4/17 20:21

#6 到底是什么数据啊,看之前的帖子说 #6 有问题,但管理员又说已经修好了,一模一样的代码在 loj 能过而洛谷过不了

#include <bits/stdc++.h>
#define pii pair<int,int>
#define pil pair<int,long long>
#define pll pair<long long,long long>
#define mp_ make_pair
#define pb_ push_back
#define pob_ pop_back
#define fst first
#define snd second
#define debug cout<<"********\n";
#define reset(x,y) memset(x,y,sizeof(x))
#define fi(x) freopen(x,"r",stdin)
#define fo(x) freopen(x,"w",stdout)
#define iosf ios::sync_with_stdio(0);cin.tie(0);
#define prec(x) cout<<setprecision(x);
#define prec0(x) cout<<fixed<<setprecision(x);
#define s(x,y) x[y-1]
#define Misaka16172 sb
#define kamisako femboy

using ll = long long;
using ld = long double;
using db = double;
using ull = unsigned long long;

constexpr int inf = 0x3f3f3f3f;
constexpr ll INF = 0x3f3f3f3f3f3f3f3f;
constexpr ull mod1 = 1e9+7,mod9 = 998244353;

using namespace std;

template <class T>
inline void read(T &x){
	x = 0;T w = 1;
	char c = 0;
	while(c<'0' || c>'9'){
		if(c=='-')	w = -1;
		c = getchar();
	}
	while(c>='0' && c<='9'){
		x = ((x<<3)+(x<<1))+c-'0';
		c = getchar();
	}
	x = x*w;
}

template <class T>
inline string bin(T x){
	string res = "";
	if(x>>1)	res = bin(x>>1);
	res+=(x&1)+'0';
	return res;
}

constexpr int N = 3005;

vector<int> to[N],to_[N];
inline void add_edge(int u,int v){to[u].pb_(v);}
inline void add_edge_(int u,int v){to_[u].pb_(v);}

int n,val[N];
int dfn[N],low[N],scc_id[N],sz[N],minv[N],cnt = 0,id = 0;
bool ins[N],vis[N],leg[N];
bool in[N];
stack<int> st;

void dfs(int u){
	cnt++;
	dfn[u] = low[u] = cnt;
	ins[u] = 1;st.push(u);
	for(int v:to[u]){
		if(!dfn[v]){
			dfs(v);
			low[u] = min(low[u],low[v]);
		}
		else if(ins[v])	low[u] = min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		id++;
		int v = -1;
		while(v!=u && !st.empty()){
			v = st.top();st.pop();
			if(val[v]<inf)	leg[id] = 1;
			scc_id[v] = id,ins[v] = 0;
			sz[id]++;
			minv[id] = min(minv[id],val[v]);
		}
	}
}

void dfs2(int u){
	if(vis[u])	return;
	// cout<<u<<"\n";
	vis[u] = 1;
	for(int v:to_[u])	dfs2(v);
}

bool cmp(int a,int b){return minv[a]<minv[b];}

void solve(){
	read(n);
	int p;read(p);
	reset(val,0x3f);
	for(int i=1;i<=p;i++){
		int a;read(a);
		read(val[a]);
	}
	int m;read(m);
	for(int i=1;i<=m;i++){
		int u,v;read(u);read(v);
		add_edge(u,v);
	}
	reset(minv,0x3f);
	for(int i=1;i<=n;i++){
		if(!dfn[i])	dfs(i);
	}
	for(int u=1;u<=n;u++){
		for(int v:to[u]){
			if(scc_id[u]!=scc_id[v]){
				add_edge_(scc_id[u],scc_id[v]);
				in[scc_id[v]] = 1;
			}
		}
	}
	int ans = 0;
	for(int i=1;i<=id;i++){
		if(!leg[i])	continue;
		if(in[i])	continue;
		dfs2(i);
		ans+=minv[i];
		bool flag = 1;
		for(int i=1;i<=n;i++){
			if(!vis[scc_id[i]]){flag = 0;break;}
		}
		if(flag){
			cout<<"YES\n";
			cout<<ans;
			return;
		}
	}
	cout<<"NO\n";
	for(int i=1;i<=n;i++){
		if(!vis[scc_id[i]]){cout<<i;return;}
	}
}

int main(){
	int t = 1;
//	read(t);
	for(int tt=1;tt<=t;tt++){
		solve();
	}
    return 0;
}
2024/4/17 20:21
加载中...