90pts,TLEon#2,求优化(dij+heap)悬关
查看原帖
90pts,TLEon#2,求优化(dij+heap)悬关
1070708
Caged_Bird楼主2024/4/21 22:57

本人本地实测,#2数据能跑出来答案(只是花了31秒而已)

#include<bits/stdc++.h>
using namespace std;
struct node{
	int to,w[2];
};
struct edge{
	int s,t,cnt=2;
}e[50005];
vector<node>a[10005],b[10005];
int dist[10005],last[2][10005],n,m;
bool flag[10005];
map<pair<int,int>,int>mp1;
map<pair<int,int>,bool>mp2[2];
void find_path(int s,int p,int l){
	if(last[l][p]==s||last[l][p]==0){
		if(!mp2[l][{last[l][p],p}]){
			mp1[{last[l][p],p}]++;
			mp2[l][{last[l][p],p}]=true;
		}
		return;
	}
	find_path(s,last[l][p],l);
	if(!mp2[l][{last[l][p],p}]){
		mp1[{last[l][p],p}]++;
		mp2[l][{last[l][p],p}]=true;
	}
	return;
	
}
void dij(int s,int l){
	priority_queue<pair<int,int> >q;
	memset(dist,0x3f,sizeof dist);
	memset(flag,false,sizeof flag);
	dist[s]=0;
	q.push({0,s});
	while(!q.empty()){
		int tot=q.top().second;
		q.pop();
		if(flag[tot])continue;
		flag[tot]=1;
		for(int i=0;i<a[tot].size();i++){
			int t=a[tot][i].to;
			if(dist[t]>dist[tot]+a[tot][i].w[l]){
				dist[t]=dist[tot]+a[tot][i].w[l];
				q.push({-dist[t],t});
				last[l][t]=tot;
			}
		}
	}
	for(int i=1;i<=n;i++)if(i!=s)find_path(s,i,l);
}
int main(){
	freopen("P3106_2.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int re,er,c,d;
		cin>>re>>er>>c>>d;
		node p;
		p.to=re;
		p.w[0]=c;
		p.w[1]=d;
		a[er].push_back(p);
		e[i].s=er;
		e[i].t=re;
	}
//	for(int i=1;i<=n;i++){
//		cout<<endl<<i<<':'<<'\t';
//		for(int j=0;j<a[i].size();j++){
//			cout<<a[i][j].to<<' '<<a[i][j].w[0]<<' '<<a[i][j].w[1]<<'\t';
//		}
//	}
	dij(n,0);
//	cout<<endl;
//	for(int i=1;i<=n;i++)cout<<dist[i]<<' ';
//	cout<<endl;
	dij(n,1);
//	for(int i=1;i<=n;i++)cout<<dist[i]<<' ';
//	cout<<endl;
	for(int i=1;i<=n;i++)a[i].clear();
	for(int i=1;i<=m;i++){
		e[i].cnt-=mp1[{e[i].s,e[i].t}];
	//	cout<<e[i].s<<' '<<e[i].t<<' '<<e[i].cnt<<'\t';
		node p;
		p.to=e[i].t;
		p.w[0]=e[i].cnt;
		a[e[i].s].push_back(p);
	}
	dij(n,0);
	//cout<<endl;
	cout<<dist[1];
	return 0;
}

注释中是调试代码。。。

2024/4/21 22:57
加载中...