求助卡常
查看原帖
求助卡常
333855
int233楼主2024/7/9 10:18

RT,目前 7070 分, TLE #11,#12,#13

本人使用 tarjan 做的这个题(

#include<iostream>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
ll t,n,m,k,mod,vr,u[200005],dis2[100005],sz[100005],f[100005][55],in[100005][55],bel[200005],v[200005],w[200005],dis[100005],low[100005],dfn[100005],vis[100005],c[100005];
vector<pair<int,int> > G[100005],T[100005],L[100005][55];
vector<int> H[100005];
stack<int> s;
priority_queue<pair<ll,int> > q;
queue<pair<int,int> > q2;
void dfs(ll x){
	low[x]=dfn[x]=++vr;
	s.push(x);
	vis[x]=1;
	for(ll i=0;i<H[x].size();i++){
		ll to=H[x][i];
		if(!dfn[to]){
			dfs(to);
			low[x]=min(low[x],low[to]);
		}
		else if(vis[to]){
			low[x]=min(low[x],dfn[to]);
		}
	}
	if(low[x]==dfn[x]){
		while(!s.empty()){
			ll cur=s.top();
			s.pop();
			bel[cur]=x;
			sz[x]++;
			vis[cur]=0;
			if(cur==x){
				break;
			}
		}
	}
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m>>k>>mod;
		for(ll i=1;i<=n;i++){
			G[i].clear();
			T[i].clear();
			H[i].clear();
			dis[i]=dis2[i]=1e17;
			vis[i]=sz[i]=bel[i]=dfn[i]=low[i]=0;
		}
		dis[1]=vr=0;
		for(ll i=1;i<=m;i++){
			cin>>u[i]>>v[i]>>w[i];
			G[u[i]].push_back({v[i],w[i]});
			T[v[i]].push_back({u[i],w[i]});
			if(!w[i]){
				H[u[i]].push_back(v[i]);
			}
		}
		q.push({-dis[1],1ll});
		while(!q.empty()){
			ll cur=q.top().second;
			q.pop();
			if(vis[cur]){
				continue;
			}
			vis[cur]=1;
			for(ll i=0;i<G[cur].size();i++){
				ll to,v;
				to=G[cur][i].first;
				v=G[cur][i].second;
				if(dis[to]>dis[cur]+v){
					dis[to]=dis[cur]+v;
					q.push({-dis[to],to});
				}
			}
		} 
		for(ll i=1;i<=n;i++){
			c[i]=dis[i];
			vis[i]=0;
		}
		dis2[n]=0;
		q.push({-dis2[n],n});
		while(!q.empty()){
			ll cur=q.top().second;
			q.pop();
			if(vis[cur]){
				continue;
			}
			vis[cur]=1;
			for(ll i=0;i<T[cur].size();i++){
				ll to,v;
				to=T[cur][i].first;
				v=T[cur][i].second;
				if(dis2[to]>dis2[cur]+v){
					dis2[to]=dis2[cur]+v;
					q.push({-dis2[to],to});
				}
			}
		} 
		for(ll i=1;i<=n;i++){
			vis[i]=0;
		}
		for(ll i=1;i<=n;i++){
			for(ll j=0;j<=k;j++){
				in[i][j]=f[i][j]=0;
				L[i][j].clear();
			}
			if(!dfn[i]){
				dfs(i);
			}
		}
		for(ll i=1;i<=m;i++){
			if(bel[u[i]]!=bel[v[i]]){
				for(ll j=0;j<=k;j++){
					if(c[u[i]]!=1e17&&c[v[i]]!=1e17&&c[u[i]]+w[i]+j-c[v[i]]<=k&&c[u[i]]+w[i]+j-c[v[i]]>=0){
						L[bel[u[i]]][j].push_back({bel[v[i]],c[u[i]]+w[i]+j-c[v[i]]});
						in[bel[v[i]]][c[u[i]]+w[i]+j-c[v[i]]]++;
					}
				}
			}
		}
		f[bel[1]][0]=1;
		while(!q2.empty()){
			q2.pop();
		}
		for(ll i=1;i<=n;i++){
			for(ll j=0;j<=k;j++){
				if(!in[i][j]){
					q2.push({i,j});
				}
			}
		}
		while(!q2.empty()){
			ll cur=q2.front().first,cur2=q2.front().second;
			q2.pop();
			for(ll i=0;i<L[cur][cur2].size();i++){
				ll tox,toy;
				tox=L[cur][cur2][i].first;
				toy=L[cur][cur2][i].second;
				f[tox][toy]=(f[tox][toy]+f[cur][cur2])%mod;
				in[tox][toy]--;
				if(!in[tox][toy]){
					q2.push({tox,toy});
				}
			}
		}
		ll ans=0,flg=1;
		for(ll i=0;i<=k;i++){
			ans=(ans+f[bel[n]][i])%mod;
		}
		//cout<<endl<<endl;
		for(ll i=1;i<=n;i++){
		//	cout<<sz[i]<<" "
			if(sz[i]>=2&&dis2[i]!=1e17&&dis[i]!=1e17&&dis[n]!=1e17&&dis[i]+dis2[i]<=dis[n]+k){
				flg=0;
				break;
			}
		}
	//	cout<<endl<<endl;
		if(!flg){
			cout<<-1<<endl;
		}
		else{
			cout<<ans<<endl;
		}
	}
	return 0;
} 
2024/7/9 10:18
加载中...