76分求助!!!
查看原帖
76分求助!!!
857626
_RainCappuccino_楼主2023/7/7 16:58

76分

#include<bits/stdc++.h>
using namespace std;

#define M 200010
#define int long long

#define For(i,j,k) for(int i=j;i<=k;i++)
#define Res(i,j,k) for(int i=j;i>=k;i--)
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define pb(i) push_back(i)
#define pf(i) push_front(i)
#define mem(a,b) memset(a,b,sizeof a)

int n, m, r;
pair<int, int> sm[M];
int cnt, hd[M];
struct Edge {
	int to, nxt;
} e[M * 2];
int nt, root, tmp, top, idx;
int dfn[M], low[M], bel[M],deg[M];
bool vis[M];
int cut[M], st[M], siz[M];
void add (int u, int v) {
	e[++cnt].to = v;
	e[cnt].nxt = hd[u];
	hd[u] = cnt;
}
int x[M], y[M];

void tarjan (int u) {
	dfn[u] = low[u] = ++tmp;
	st[++top] = u;
	for (int i = hd[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (!dfn[v]) {
			tarjan (v);
			low[u] = min (low[u], low[v]);
		} else if (!bel[v]) low[u] = min (low[u], dfn[v]);
	}
	if (dfn[u] == low[u]) {
		siz[++idx] = 1;
		bel[u] = idx;
		while (st[top] != u) {
			bel[st[top]] = idx;
			siz[idx]++;
			top--;
		}
		top--;
	}
}
int num;
void dfs(int u) {
	num ++;
	vis[u] = 1;
	for (int i = hd[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (!vis[v]) dfs(v);
	}
}
bool cmp(pair<int, int> a, pair<int, int> b) {
	return deg[bel[a.first]] > deg[bel[b.first]];
}
signed main() {
	scanf("%lld%lld", &n, &r);
	For(i, 1, r) {
		scanf("%lld%lld", &sm[i].first, &sm[i].second);
	}
	scanf("%lld", &m);
	For(i, 1, m) {
		int u, v;
		scanf("%lld%lld", &u, &v);
		x[i] = u, y[i] = v;
		add(u, v);
	}
	For(i, 1, n) {
		if (!dfn[i]) {
			tarjan(i);
		}
	}
	cnt = 0;
	mem(hd, 0);
	mem(e, 0);
	For(i, 1, m) {
		if (bel[x[i]] != bel[y[i]]) {
			add (bel[x[i]], bel[y[i]]);
			deg[bel[x[i]]] ++;
		}
	}
	sort(sm + 1, sm + 1 + r, cmp);
	int ans = 0;
	For(i, 1, r) {
		int u = sm[i].first;
		if(!vis[bel[u]]){
			ans += sm[i].second;
			dfs(bel[u]);
		}
		if (num == idx) {
			printf("YES\n");
			printf("%lld", ans);
			return 0;
		}
	}
	printf("NO\n");
	ans = n + 1;
	For(i, 1, idx) {
		if (!vis[i]) {
			For(j,1,n){
				if(bel[j] == i){
					ans = min(ans,j);
				}
			}
		}
	}
	cout << ans;
	return 0;
}
//时间轴
2023/7/7 16:58
加载中...