样例挂了,求调
查看原帖
样例挂了,求调
537998
lpx2024楼主2023/10/15 09:43
#include<bits/stdc++.h>
using namespace std;
const int maxN=10010;
struct node{
	int to,val;
};
priority_queue<node> q;
vector<int> v[maxN],v2[maxN];
stack<int> s;
int timestp,m,cnt,ans,dfn[maxN],low[maxN],bl_scc[maxN],c_scc[maxN];
bool book[maxN];
bool operator<(node n1,node n2){
	return n1.val<n2.val;
}
void dfs(int x){
	dfn[x]=++timestp,low[x]=dfn[x];
	s.push(x),book[x]=1;
	for(int y:v[x]){
		if(!dfn[y]){
			dfs(y);
			low[x]=min(low[x],low[y]);
		} else if(book[y]) low[x]=min(low[x],low[y]);
	}
	if(low[x]==dfn[x]){
		cnt++;
		do{
			m=s.top();
			s.pop();
			bl_scc[m]=cnt;
			c_scc[cnt]++;
			book[m]=0;
		}while(x!=m);
	}
}
int main(){
	int n,x,y;
	scanf("%d%d",&n,&m);
	while(m--){
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
	for(int i=1;i<=n;i++){
		for(int j:v[i]){
			if(bl_scc[i]!=bl_scc[j]){
				v2[bl_scc[i]].push_back(bl_scc[j]);
				v2[bl_scc[i]+cnt].push_back(bl_scc[j]+cnt);
				v2[bl_scc[j]].push_back(bl_scc[i]+cnt);
			}
		}
	}
	q.push(node{bl_scc[1],0}),m=c_scc[bl_scc[1]];
	while(!q.empty()){
		node t=q.top();
		q.pop();
		if(book[t.to]) continue;
		book[t.to]=1;
		if(t.to==bl_scc[1]+cnt) m=max(m,t.val);
		for(auto y:v2[t.to]) q.push(node{y,t.val+c_scc[bl_scc[y]]});
	}
	printf("%d",m);
	return 0;
}
2023/10/15 09:43
加载中...