44分求助,4次最短路+2次拓扑,通过了讨论区的hack数据
查看原帖
44分求助,4次最短路+2次拓扑,通过了讨论区的hack数据
776599
jping楼主2023/6/30 23:15
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int Nm=1502;
struct Edg{
	int v,w; 
}el[Nm*Nm],el2[Nm*Nm];
int n,te=0,head[Nm],vis[Nm],nxt[Nm*Nm];
int head2[Nm],nxt2[Nm*Nm],in[Nm],len[Nm];
int dis[5][Nm];
struct node{
	int p,d;
	friend bool operator < (node a,node b){
		return a.d>b.d;//小的在前面 
	}
}now,tn;
void dij(int x,int s){
	int t;
	priority_queue<node>AA;
	memset(vis,0,sizeof(vis));
	tn.p=s;
	tn.d=0;
	AA.push(tn);
	while(!AA.empty()){//(n+m)log(n+m)
		now=AA.top();
		AA.pop();
		if(vis[now.p]==1)continue;
		vis[now.p]=1;
		dis[x][now.p]=now.d;
		t=head[now.p];
		while(t>0){
			if(vis[el[t].v]==0){
				tn.p=el[t].v;
				tn.d=now.d+el[t].w;
				AA.push(tn);
			}
			t=nxt[t];
		}
	}
	
	return;
}
void add_edge(int x,int y,int w){
	te++;
	el[te].v=y;
	nxt[te]=head[x];
	el[te].w=w;
	head[x]=te;
	return;
}
int topo(){
	int lmax=0;
	queue<int>AA;
	for(int i=1;i<=n;i++){
		if(in[i]==0)AA.push(i);
	}
	int no,tt;
	while(!AA.empty()){
		no=AA.front();
		AA.pop();
		lmax=max(lmax,len[no]);
		tt=head2[no];
		while(tt>0){
			len[el2[tt].v]=max(len[el2[tt].v],len[no]+el2[tt].w);
			in[el2[tt].v]--;
			if(in[el2[tt].v]==0){
				AA.push(el2[tt].v);
			}
			tt=nxt[tt];
		}
	}
	return lmax;
}
int main(){
	int m,x1,y1,x2,y2,t;
	cin>>n>>m;
	cin>>x1>>y1>>x2>>y2;
	int u,v,w;
	for(int i=0;i<m;i++){
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	memset(dis,0x3f,sizeof(dis));
	dij(1,x1);
	dij(2,y1);
	dij(3,x2);
	dij(4,y2);
		
	int cnt=0;
	for(int i=1;i<=n;i++){//检查边 
		for(int j=head[i];j>0;j=nxt[j]){
			if(dis[1][i]+el[j].w+dis[2][el[j].v]==dis[1][y1]){
				if(dis[3][i]+el[j].w+dis[4][el[j].v]==dis[3][y2]){
					cnt++;
					el2[cnt].v=el[j].v;
					el2[cnt].w=el[j].w;
					nxt2[cnt]=head2[i];
					head2[i]=cnt;
					in[el[j].v]++;
				}
			}
		}
	}
	int ans=topo();
	memset(el2,0,sizeof(el2));
	memset(head2,0,sizeof(head2));
	memset(nxt2,0,sizeof(nxt2));
	memset(len,0,sizeof(len));
	memset(in,0,sizeof(in));
	cnt=0;
	for(int i=1;i<=n;i++){//检查边 
		for(int j=head[i];j>0;j=nxt[j]){
			if(dis[1][i]+el[j].w+dis[2][el[j].v]==dis[1][y1]){
				if(dis[4][i]+el[j].w+dis[3][el[j].v]==dis[3][y2]){
					cnt++;
					el2[cnt].v=el[j].v;
					el2[cnt].w=el[j].w;
					nxt2[cnt]=head2[i];
					head2[i]=cnt;
					in[el[j].v]++;
				}
			}
		}
	}
	cout<<max(ans,topo());
	return 0;
}
2023/6/30 23:15
加载中...