4遍最短路,2遍拓扑。
没过讨论区hack。。。想知道代码错在哪了。
#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read() {
int x=0,f=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f?-x:x;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+48);
}
const int N=3e6+2023;
const int INF=0x3f3f3f3f;
int n,m,dis[5][N],head[N],cnt,s_cnt,s_head[N];
int dp[N],deg[N],ax,ay,bx,by;
bool vis[N];
struct node{
int next,to,w;
}e[N];
void add(int u,int v,int w) {
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void dj(int k,int x){
for (int i=1;i<=n;++i) {
dis[k][i]=INF;
vis[i]=0;
}
priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;
dis[k][x]=0;
q.push(make_pair(0,x));
while(!q.empty()){
int now=q.top().second; q.pop();
if (vis[now]) continue;
vis[now]=1;
for (int i=head[now];i;i=e[i].next) {
if (dis[k][e[i].to]>dis[k][now]+e[i].w) {
dis[k][e[i].to]=dis[k][now]+e[i].w;
q.push(make_pair(dis[k][e[i].to],e[i].to));
}
}
}
}
struct sd{
int next,to,w;
}s[N];
void s_add(int u,int v,int w) {
s[++s_cnt].next=s_head[u];
s[s_cnt].to=v;
s[s_cnt].w=w;
s_head[u]=s_cnt;
}
void topo() {
queue<int>q;
for (int i=1;i<=n;++i) {
if (!deg[i]) q.push(i);
}
while(!q.empty()) {
int now=q.front(); q.pop();
for (int i=s_head[now];i;i=s[i].next) {
--deg[s[i].to];
dp[s[i].to]=max(dp[s[i].to],dp[now]+s[i].w);
if (!deg[s[i].to]) q.push(s[i].to);
}
}
}
signed main(){
n=read(); m=read();
ax=read(); ay=read(); bx=read(); by=read();
for (int i=1;i<=m;++i) {
int x=read(),y=read(),z=read();
add(x,y,z); add(y,x,z);
}
dj(1,ax); dj(2,ay);
dj(3,bx); dj(4,by);
for (int now=1;now<=n;++now) {
for (int i=head[now];i;i=e[i].next) {
if ((dis[1][now]+e[i].w+dis[2][e[i].to]==dis[1][ay])&&(dis[3][now]+e[i].w+dis[4][e[i].to]==dis[3][by])) {
s_add(now,e[i].to,e[i].w);
deg[e[i].to]++;
}
}
}
topo();
int ans=0;
for (int i=1;i<=n;++i){
ans=max(ans,dp[i]);
// cout<<" "<<dp[i]<<endl;
}
// cout<<" "<<ans<<endl;
memset(dp,0,sizeof(dp));
memset(deg,0,sizeof(deg));
memset(s_head,0,sizeof(s_head));
s_cnt=0;
//cout<<dis[1][ay]<<endl;
for (int now=1;now<=n;++now) {
for (int i=head[now];i;i=e[i].next) {
if (dis[1][now]+e[i].w+dis[2][e[i].to]==dis[1][ay]) {
if (dis[4][now]+e[i].w+dis[3][e[i].to]==dis[3][by])
s_add(now,e[i].to,e[i].w);
// deg[e[i].to]++;
}
}
}
topo();
for (int i=1;i<=n;++i) {
ans=max(ans,dp[i]);
//cout<<" "<<dp[i]<<endl;
}
cout<<ans;
return 0;
}