88分,被hack了
查看原帖
88分,被hack了
696967
int_Hello_world楼主2023/7/12 17:57

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;
}
2023/7/12 17:57
加载中...