社区讨论

数据好像不够全面

P2656采蘑菇参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m1ndj8qt
此快照首次捕获于
2024/09/29 17:24
去年
此快照最后确认于
2025/11/04 18:31
4 个月前
查看原帖
对于如下数据
CPP
5 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 条回复,欢迎继续交流。

正在加载回复...