52分求助
查看原帖
52分求助
554616
Lotus_Land楼主2024/10/20 07:46

看不出来和这份AC代码有什么不同

#include<bits/stdc++.h>
#define lc(p) ((p)*2)
#define rc(p) ((p)*2+1)
#define mkpr make_pair
#define LL int 
using namespace std;
inline LL read() {
	char ch=getchar();
	LL x=0;
	bool t=0;
	while(ch<'0'||ch>'9')   t|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	return t?-x:x;
}
const int M=300005,N=1505;
int n,m;
int S1,S2,T1,T2;
int u[N],v[N],w[N];
struct Edge {
	int v,w,nxt;
} e[M<<1];
int cnt,head[N];
void Add(int u,int v,int w) {
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

struct node {
	int u;
	LL d;
	bool operator <(const node &rhs)const {
		return d>rhs.d;
	}
};
void Dijkstra(int ST,LL *arr) {
	priority_queue<node>q;
	arr[ST]=0;
	q.push((node) {
		ST,0
	});
	while(!q.empty()) {
		node fr=q.top();
		q.pop();
		int u=fr.u;
		LL d=fr.d;
		if(d!=arr[u])continue;
		for(int i=head[u]; i; i=e[i].nxt) {
			int v=e[i].v;
			LL w=e[i].w;
			if(arr[u]+w<arr[v]) {
				arr[v]=arr[u]+w;
				q.push((node) {
					v,arr[v]
				});
			}
		}
	}
}
LL dis[2][N],dis2[2][N];
vector<pair<int,int> >G[N];
LL dp[N];
LL DFS(int u) {
	if(dp[u])return dp[u];
	for(int i=0; i<G[u].size(); i++) {
		pair<int,int> ee=G[u][i];
		int v=ee.first,w=ee.second;
		dp[u]=max(dp[u],DFS(v)+w);
	}
	return dp[u];
}
bool in[N];
int main() {
	n=read();
	m=read();
	S1=read();
	T1=read();
	S2=read();
	T2=read();
	for(int i=1; i<=m; i++) {
		u[i]=read();
		v[i]=read();
		w[i]=read();
		Add(u[i],v[i],w[i]);
		Add(v[i],u[i],w[i]);
	}
	memset(dis,0x3f,sizeof dis);
	memset(dis2,0x3f,sizeof dis2);
	Dijkstra(S1,dis[0]);
	Dijkstra(T1,dis[1]);
	Dijkstra(S2,dis2[0]);
	Dijkstra(T2,dis2[1]);
	for(int i=1; i<=n; i++) {
		//	cout<<dis[0][i]<<" "<<dis[1][i]<<endl;
	}
	for(int u=1; u<=n; u++) {
		for(int i=head[u]; i; i=e[i].nxt) {
			int v=e[i].v,w=e[i].w;
			if(dis[0][u]+w+dis[1][v]==dis[0][T1]) {
				if(dis2[0][u]+w+dis2[1][v]==dis2[0][T2])G[u].push_back(mkpr(v,w)),in[u]=in[v]=1;
				if(dis2[0][v]+w+dis2[1][u]==dis2[0][T2])G[v].push_back(mkpr(u,w)),in[u]=in[v]=1;
			}
		}
	}
	for(int i=1; i<=n; i++) {
		if(in[i]&&!dp[i])DFS(i);
	}
	LL ans=0;
	for(int i=1; i<=n; i++) {
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	return 0;
}

2024/10/20 07:46
加载中...