社区讨论

缩点板子求调玄关

P2656采蘑菇参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@m3ekrt2j
此快照首次捕获于
2024/11/12 22:56
去年
此快照最后确认于
2025/11/04 14:50
4 个月前
查看原帖
rt
CPP
#include<bits/stdc++.h>
#define int long long
#define Up(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=2e5+10;
int n,m;
struct edge{
	int u,v,w,f;
}E[N];
struct EDGE{
	int v,w;
};
vector<EDGE> ee[N];
vector<edge> e[N];
int dfn[N],low[N],col[N],dis[N],vis[N],sum[N],idx,V[N];
stack<int> st;
void tarjin(int u){
	dfn[u]=low[u]=++idx,vis[u]=1;
	st.push(u);
	for(auto it:e[u]){
		int v=it.v;
		if(!dfn[v]){
			tarjin(v);
			low[u]=min(low[u],low[v]);
		}else if(vis[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		int v;
		while(st.size()){
			v=st.top();st.pop();
			col[v]=u,vis[v]=0;
			if(u==v) break;
		}
	}
}
queue<int> q;
signed main(){
	cin.tie(0),cout.tie(0)->sync_with_stdio(0);
	cin>>n>>m;
	Up(i,1,m){
		int u,v,w;double f;
		cin>>u>>v>>w>>f;
		int ff=f*10ll;
		E[i]={u,v,w,ff};
		e[u].push_back({u,v,w,ff});
	}
	Up(i,1,n){
		if(!dfn[i]) tarjin(i);
	}
	Up(i,1,n){
		for(auto it:e[i]){
			int u=i,v=it.v,w=it.w,f=it.f;
			if(col[u]!=col[v]){
				ee[col[u]].push_back(EDGE{col[v],w});
			}else{
				while(w){
					sum[col[u]]+=w;
					w=w*f/10;
				}
			}
		}
	}
	int s;
	cin>>s;
	s=col[s];
	q.push(s);
	while(q.size()){
		int u=q.front();q.pop();
		if(V[u]) continue;
		V[u]=1;
		for(auto it:ee[u]){
			int v=it.v,w=it.w;
			if(dis[v]<dis[u]+w+sum[v]){
				dis[v]=dis[u]+w+sum[v];
				q.push(v);
			}
		}
	}
	int ans=0;
	Up(i,1,n){
		ans=max(ans,dis[i]);
	}
	cout<<ans<<"\n";
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...