mxqz Tarjan板子/kel
查看原帖
mxqz Tarjan板子/kel
253765
houpingze楼主2021/8/30 20:02

rt/kk

刚学tarjan,参照第一篇题解搞得,样例1不知道为啥总是输出INF,提交三十多分/tuu

感谢巨佬们,会有微小的小号关注/kel

#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define pb push_back
#define vc vector
#define fst first
#define scd second
//#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int read(){
	int res=0,fs=1; char c=getchar();
	while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
	while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
	return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int n,cnt,m,ans,tmp,k;
typedef pair<int,int> P;
//struct PROBLEM_SOLVER{
//	   int n,m;
//}solver;

//signed main(){
int f[100050];
struct node{
	int u,v,w;
}a[1000005]; 
vector<int>G[100005];
int vis[10005],r; 
int path[3005];
int ru[100005];  
	int dfn[1000005],low[100005],tong[1000005];
	int sum[1000005];
	int tim=0; 
	// stack<int>stk;
	int top=0,stk[100005];
	int kid[100005];
	void tarjan(int x){
		// if(dfn[x]) return ;
		// cout<<"TARJAN:"<<x<<endl;
		// stk.push(x);
		top++;
		stk[top]=x;
		tong[x]=1;
		tim++;
		dfn[x]=low[x]=tim;
		for(int i=0;i<G[x].size();i++){
			int u=x,v=G[x][i];
			if(!dfn[v]){
				// cout<<"\t to "<<v<<endl;
				tarjan(v);
				low[x]=min(low[x],low[v]);
			}else{
				if(tong[v]) low[x]=min(low[x],dfn[v]);
			}
		}
		if(dfn[x]==low[x]){ 
			cnt++; 
			// cout<<"#"<<cnt<<":\n";
			// cout<<"\t"<<stk[1]<<' '<<stk[2]<<endl; 
			while(stk[top+1]!=x){ 
			// cout<<"\t\t ok\n";
				sum[cnt]=min(sum[cnt],f[stk[top]]); 
				kid[stk[top]]=cnt; 
				tong[stk[top]]=0; 
				top--;
			} 
		}
	}
	void sol1(){ 
		memset(sum,0x3f,sizeof(sum));
		rep(i,1,n){
			if(!dfn[i]&&f[i]<=100000000) {
				tarjan(i);
			}
		}
		rep(i,1,n){
			if(!dfn[i]){
				cout<<"NO\n"<<i;
				return ;
			}
		}
		rep(i,1,n){
			for(int j=0;j<G[i].size();j++){
				int u=i,v=G[i][j];
				if(kid[u]!=kid[v]){
					ru[v]++;
				}
			}
		}
		rep(i,1,cnt){
			if(ru[i]==0) ans+=sum[i];
		}
		cout<<"YES\n"<<ans;
	} 
int main() { 
	cin>>n>>k;
	memset(f,0x3f,sizeof(f));
	// f[0]=0;
	rep(i,1,k){
		int idx,x;
		cin>>idx>>x;
		
		f[idx]=x;
	}
	// rep(i,1,n) xuyao[i]=1;
	cin>>r;
	rep(i,1,r){
		cin>>a[i].u>>a[i].v;
		G[a[i].u].pb(a[i].v); 
	}
	sol1();
    return 0;
}
2021/8/30 20:02
加载中...