社区讨论
数据好像不够全面
P2656采蘑菇参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m1ndj8qt
- 此快照首次捕获于
- 2024/09/29 17:24 去年
- 此快照最后确认于
- 2025/11/04 18:31 4 个月前
对于如下数据
CPP5 5
1 2 1 0
2 3 1 0
3 4 1 0
4 5 1 0
5 2 1 0
1
答案显然是5,而如下 AC 程序输出了4
CPP#include <stdio.h>
#include <string.h>
#include <queue>
const int N=80009,M=200009;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
using namespace std;
int head[N],ver[M],edge[M],nxt[M],tot;
void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
}
int dfn[N],low[N],num,cnt,c[N];
int sta[N],ins[N],top;
void tarjan(int x){
dfn[x]=low[x]=++num;
sta[++top]=x;ins[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
++cnt;
int y;
do{
y=sta[top--];ins[y]=0;
c[y]=cnt;//scc[cnt].push_back(y);
}while(y!=x);
}
}
int hc[N],vc[M],ec[M],nc[M],tc;
void add_c(int x,int y,int z){
vc[++tc]=y,ec[tc]=z,nc[tc]=hc[x],hc[x]=tc;
}
int n,m,s;
int k[M],g[N],f[N],ind[N];
queue<int> q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;double kk;
scanf("%d%d%d%lf",&x,&y,&z,&kk);
k[i]=kk*10;
add(x,y,z);
}
scanf("%d",&s);
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int x=1;x<=n;x++)
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(c[x]==c[y])
while(edge[i]){
g[c[x]]+=edge[i];
edge[i]=edge[i]*k[i]/10;
}
else add_c(c[x],c[y],edge[i]),ind[c[y]]++;
}
memset(f,-0x3f,sizeof f);
f[c[s]]=0;
for(int i=1;i<=cnt;i++)
if(!ind[i])q.push(i);
while(q.size()){
int x=q.front();q.pop();
for(int i=hc[x];i;i=nc[i]){
int y=vc[i];
f[y]=max(f[y],f[x]+g[x]+ec[i]);
ind[y]--;
if(!ind[y])q.push(y);
}
}
f[1]=g[1];
int ans=0;
for(int i=1;i<=cnt;i++)
ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...