社区讨论
缩点板子求调玄关
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 条回复,欢迎继续交流。
正在加载回复...