35分求调
查看原帖
35分求调
782125
Jasonshan10楼主2023/11/12 13:27
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5,MAXK=105;
int n,m,k,ans=-1;
vector<pair<int,int>> G[MAXN];
int vis[MAXN][MAXK];
bool check(int a,int b,int na,int nb,int x){
	if (vis[a][b]-1<x || vis[na][nb]!=-1){
		return false;
	}
	return true;
}
bool bfs(int x){
	queue<pair<int,int>> q;
	q.push({n,0});
	memset(vis,-1,sizeof(vis));
	vis[n][0]=x*k;
	while (!q.empty()){
		pair<int,int> temp=q.front();
		q.pop();
		int a=temp.first,b=temp.second;
		if (vis[a][b]!=0){
			for(int i=0;i<G[a].size();++i){
				pair<int,int> _t=G[a][i];
				int na=_t.first,nb=(b+k-1)%k;
				if (!check(a,b,na,nb,_t.second)) continue;
				vis[na][nb]=vis[a][b]-1;q.push({na,nb});
			}		
		}
	}
	if (vis[1][0]==-1){
		return false;
	}
	return true;
}
int main(){
	scanf("%d %d %d",&n,&m,&k);
	for(int i=1,u,v,a;i<=m;++i){
		scanf("%d %d %d",&u,&v,&a);
		G[v].push_back({u,a});
	}
	int l=0,r=200000/k;
	while (l<r){
		int mid=(l+r)/2;
		if (bfs(mid)){
			ans=mid*k;r=mid;continue;
		}
		l=mid+1;
	}
	printf("%d\n",ans);
	return 0;
}
2023/11/12 13:27
加载中...