60tle求助,复杂度应该是O(5*nlogm+8m),不清楚为啥t飞
查看原帖
60tle求助,复杂度应该是O(5*nlogm+8m),不清楚为啥t飞
597716
IT__windy楼主2022/8/29 20:21
#include<bits/stdc++.h>
#define N 6505
#define f1(i,n,m) for(int i=n;i<=m;++i)
#define f2(i,n,m) for(int i=n;i>=m;--i)
#define max(a,b) (a>b?a:b)
#define reset(a,b) memset(a,b,sizeof(a))
#define M 0x3f3f3f
using namespace std;
template <typename T>
void read(T &x){
	int w=1;x=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	x*=w;
}
int head[N*N*2],nex[N*N*2],to[N*N*2],w[N*N*2],from[N*N*2],dis[10][N],pi[N*N*2];
int n,m,s1,s2,ed1,ed2,tot=1;
bool vis[N];
struct edge{
	int to,id;
};
vector<edge>e[N];
struct node{
	int d,id;
	bool operator<(const node& a) const {
		return a.d<d;
	}
};
void add(int x,int y,int wi){
	to[++tot]=y;
	from[tot]=x;
	w[tot]=wi;
	nex[tot]=head[x];
	head[x]=tot;
}
void dij(int s,int *dis){//最短路 
	priority_queue<node>q;
	int x,y;
	f1(i,1,n)dis[i]=M;
	reset(vis,0);
	dis[s]=0;
	q.push(node{0,s});
	while(!q.empty()){
		x=q.top().id;
		q.pop();
		for(int i=head[x];i;i=nex[i]){
			y=to[i];
			if(dis[y]>dis[x]+w[i]){
			   dis[y]=dis[x]+w[i];
				if(!vis[y])q.push(node{dis[y],y});
			}
		}
	}
}
void dij2(int s,int *dis){//最长路 
	priority_queue<node>q;
	int x,y,i;
	f1(i,1,n)dis[i]=M;
	reset(vis,0);
	dis[s]=0;
	q.push(node{0,s});
	while(!q.empty()){
		x=q.top().id;
		q.pop();
		vis[x]=0;
		for(auto v:e[x]){
			i=v.id,y=v.to;			
			if(pi[i]<3)continue;
			if(dis[y]>dis[x]-(pi[i]+pi[i^1]==5? 1:0)*w[i]){
			   dis[y]=dis[x]-(pi[i]+pi[i^1]==5? 1:0)*w[i];
				if(!vis[y])q.push(node{dis[y],y}),vis[y]=1;
			}
		}
	}
}
void work(int *d1,int *d2,int t){
	f1(i,2,m*2+1)if(d1[from[i]]+d2[to[i]]+w[i]==d1[t]){
		if(t==ed1)pi[i]+=2;
		else if(t==ed2)pi[i]+=3;	
		e[from[i]].push_back(edge{to[i],i});
	}
}
signed main(){
	int x,y,wi;
	read(n),read(m);
	read(s1),read(ed1),read(s2),read(ed2);
	f1(i,1,m){
		read(x),read(y),read(wi);
		add(x,y,wi);
		add(y,x,wi);
	}
	dij(s1,dis[1]);dij(ed1,dis[2]);
	dij(s2,dis[3]);dij(ed2,dis[4]);
	work(dis[1],dis[2],ed1);
	work(dis[3],dis[4],ed2);
	f1(i,1,m*2+1)
//	if(pi[i])cout<<" "<<from[i]<<" "<<to[i]<<endl;	
//	cout<<dis[1][from[9]]+w[9]+dis[2][to[9]];
//	cout<<from[9]<<" "<<to[9];
	dij2(s2,dis[5]);
//	f1(i,1,n)cout<<dis[1][i]<<" ";
	cout<<-dis[5][ed2];
}
2022/8/29 20:21
加载中...