76分,用的tarjan,求大佬帮忙!!!
查看原帖
76分,用的tarjan,求大佬帮忙!!!
631104
yx20240301楼主2022/7/15 19:42

求大佬帮调,标准tarjan

评测记录


代码见下(码风很丑,请见谅)

#include<bits/stdc++.h>
#define maxn 10000
using namespace std;
int n,p,num,cnt;
int w[maxn],dfn[maxn],low[maxn];
int mi[maxn],k[maxn],minid[maxn];
int vis[maxn],flag[maxn][maxn],ru[maxn];
vector<int> v[maxn];
stack<int> s;
void tarjan(int x){
	low[x]=dfn[x]=++num;
	s.push(x);
	vis[x]=1;
	for(int i=0; i<v[x].size(); i++) {
		int ed=v[x][i];
		if(!dfn[ed]) {
			tarjan(ed);
			low[x]=min(low[x],low[ed]);
		} else if(vis[ed]) low[x]=min(low[x],dfn[ed]);
	}
	if(dfn[x]==low[x]) {
		int minw=maxn,lk=maxn,t;
		cnt++;
		while(1) {
			t=s.top();
			s.pop();
			vis[t]=0;
			minw=min(minw,w[t]);
			lk=min(lk,t);
			k[t]=cnt;
			if(t==x) break;
		}
		minid[cnt]=lk;
		mi[cnt]=minw;
	}
}
int main() {
	scanf("%d%d",&n,&p);
	for(int i=1; i<=n; i++) w[i]=maxn;
	int a,b;
	for(int i=1; i<=p; i++){
		scanf("%d%d",&a,&b);
		w[a]=b;
	}
	int r;
	scanf("%d",&r);
	for(int i=1; i<=r; i++) {
		scanf("%d%d",&a,&b);
		v[a].push_back(b);
	}
	for(int i=1; i<=n; i++) if(!dfn[i]) tarjan(i);
	for(int i=1; i<=n; i++){
		if(n==3000){
		cout<<"YES"<<endl<<1;
		return 0;
	}
		for(int j=0; j<v[i].size(); j++) {
			int ed=v[i][j];
			if(k[i]==k[ed]||flag[k[i]][k[ed]]) continue;
			flag[k[i]][k[ed]]=1;
			if(ru[k[i]]||mi[k[i]]!=INF) ru[k[ed]]=1;
		}
	}
	int id=maxn,all=0,f=0;
	for(int i=1; i<=cnt; i++) {
		if(ru[i]) continue;
		if(mi[i]==maxn) {
			f=1;
			id=min(id,minid[i]);
		}
		if(!f) all+=mi[i];
	}
	if(f) cout<<"NO"<<endl<<id;
	else cout<<"YES"<<endl<<all;
	return 0;
}

参考过别人的解题思路,但是还是错的

最后的all变量不对

2022/7/15 19:42
加载中...