91分求助
查看原帖
91分求助
509435
liubw_楼主2021/9/4 23:57
#define N 1505
#define ll long long
#define maxx 0x3f3f3f3f
using namespace std;
int n,m,ans=0;
int x1,x2,yy,y2;
int head[N],nex[N*N],to[N*N],e[N*N],tot=1;
int head2[N],nex2[N*N],to2[N*N],e2[N*N],tot2=1;
void add1(int x,int y,int z){
	int k=head[x];
	head[x]=tot;
	to[tot]=y;
	nex[tot]=k;
	e[tot]=z;
	tot++;
}
int ru[N];
void add2(int x,int y,int z){
	ru[y]++;
	int k=head2[x];
	head2[x]=tot2;
	to2[tot2]=y;
	nex2[tot2]=k;
	e2[tot2]=z;
	tot2++;
}

int dis[5][N];
bool vis[N];
struct node{
	int dis,id;
	bool operator < (const node &b) const{
		return dis>b.dis;
	}
};
priority_queue<node> q;
void dijk(int num,int s){
	memset(dis[num],maxx,sizeof(dis[num]));
	memset(vis,0,sizeof(vis));
	dis[num][s]=0;
	vis[s]=1;
	q.push({0,s});
	while(!q.empty()){
		int u=q.top().id;
		q.pop();
		for(int k=head[u];k;k=nex[k]){
			int v=to[k],w=e[k];
			if(dis[num][v]>dis[num][u]+w){
				dis[num][v]=dis[num][u]+w;
				if(!vis[v]) vis[v]=1,q.push({dis[num][v],v});
			}
		}
	}
}

int l[N],que[N],h,la;
int q_pop(){
	return que[h++];
}
void q_push(int x){
	que[la++]=x;
}
void topo(){
	h=0;
	la=0;
	memset(l,0,sizeof(l));
	for(int i=1;i<=n;i++){
		if(ru[i]==0) q_push(i);
	}
	while(h<la){
		int u=q_pop();
//		cout<<"	"<<u<<" "<<l[u]<<endl;
		for(int k=head2[u];k;k=nex2[k]){
			int v=to2[k],w=e2[k];
			l[v]=max(l[v],l[u]+w);
			ru[v]--;
			if(ru[v]==0) q_push(v);
		}
	}
}
int main(){
	cin>>n>>m;
	cin>>x1>>yy>>x2>>y2;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add1(u,v,w);
		add1(v,u,w);
	}
	dijk(1,x1);
	dijk(2,yy);
	dijk(3,x2);
	dijk(4,y2);
	int len1=dis[1][yy],len2=dis[3][y2];
	for(int u=1;u<=n;u++){
		for(int k=head[u];k;k=nex[k]){
			int v=to[k],w=e[k];
			if(dis[1][u]+w+dis[2][v]==len1&&dis[3][u]+w+dis[4][v]==len2) add2(u,v,w);
		}
	}
	topo();
	for(int i=1;i<=n;i++) ans=max(ans,l[i]);
	memset(head2,0,sizeof(head2));
	memset(nex2,0,sizeof(nex2));
	memset(ru,0,sizeof(ru));
	tot2=1;
	for(int u=1;u<=n;u++){
		for(int k=head[u];k;k=nex[k]){
			int v=to[k],w=e[k];
			if(dis[1][u]+w+dis[2][v]==len1&&dis[4][u]+w+dis[3][v]==len2) add2(u,v,w);
		}
	}
	topo();
	for(int i=1;i<=n;i++) ans=max(ans,l[i]);
	cout<<ans<<endl;
	return 0;
}
2021/9/4 23:57
加载中...