社区讨论

求助,定给您点关注

P1073[NOIP 2009 提高组] 最优贸易参与者 2已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@loi8gqjw
此快照首次捕获于
2023/11/03 14:27
2 年前
此快照最后确认于
2023/11/03 18:48
2 年前
查看原帖

感觉很假的分层图做法(因为并不会)

WA了第12个点,很有可能做法不对(我个人觉得没问题)数据过水其它点混过去了 数据太大了不好推可以帮忙看看吗 谢谢!!!!!!!!!!!
CPP
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
const int N=1e5+5;
const int M=1e6+5;
int d[N*3];
queue<int> q;
int n,m;
int z[N];
vector<int> son[3*N];
bool cf[3*N];
void add(int x,int y){
	son[x].push_back(y);
	return ;
}
void bfs(int cs){
	q.push(cs);
	if(cs==1)d[1]=-1*z[1];
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<son[x].size();i++){
			int y=son[x][i];
			if(y<=n){
				d[y]=max(d[x],-1*z[y]);
			}else if(y>n&&y<=2*n){
				d[y]=d[y-n]+z[y-n];
				d[y]=max(d[x],d[y]);
				d[y+n]=d[y];
			}else{
				d[y]=max(d[x],d[y]);
			} 
			if(cf[y]==1)continue;
			cf[y]=1;
			q.push(y);
		}
	}
	return ;
}
int x,y,pd;
int main(){
	cin>>n>>m;
	for(int i=1;i<=3*n;i++){
		d[i]=-200;
	}
	for(int i=1;i<=n;i++){
		cin>>z[i];
	}
	for(int i=1;i<=m;i++){
		cin>>x>>y>>pd;
		add(x,y);
		add(x+n,y+n);
		add(x+2*n,y+2*n); 
		if(pd==2){
			add(y,x);
			add(y+n,x+n);
			add(y+2*n,x+2*n);
		}
	}
	bfs(1);
	bfs(1+n);
	bfs(1+n*2);
	cout<<d[3*n];
	return 0;
}

回复

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

正在加载回复...