社区讨论

普及T4正确性求助

灌水区参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo76kz9c
此快照首次捕获于
2023/10/26 20:49
2 年前
此快照最后确认于
2023/11/02 11:17
2 年前
查看原帖
代码复杂度好像是 O(k(n+m))O(k(n+m)),解法是二分+bfsbfs,赛时大样例没过,但洛谷云斗都能过,某平台挂了一个点,无法查看数据,不知道哪里锅了
CPP
#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(int i=j;i<=n;i++)
using namespace std;
const int N=1e5+10;
ll n,m,k=1e5,l,r,x,y,u,v,w,T,id,t,cnt,ans=1e18;
ll mx=0,mn=1e18;
ll head[N];
struct Node{
	ll nxt,to,dis;
}tr[N];
void add(ll u,ll v,ll w){
	t++;
	tr[t].to=v;
	tr[t].dis=w;
	tr[t].nxt=head[u];
	head[u]=t;
}
struct node{
	ll id,tim;
};
ll vis[N][105];
ll bfs(ll x){
	F(i,1,n) F(j,0,k-1) vis[i][j]=0;
	queue<node> q;
	q.push({1,x});
	while(!q.empty()){
		node p=q.front();
		q.pop();
		if(vis[p.id][p.tim%k]) continue ;
		vis[p.id][p.tim%k]=1;
		if(p.id==n&&p.tim%k==0) return p.tim;
		for(ll i=head[p.id];i;i=tr[i].nxt){
			ll v=tr[i].to;
			if(p.tim>=tr[i].dis) q.push({v,p.tim+1});
		}
	}
	return -1;
}
int main(){
	cin>>n>>m>>k;
	F(i,1,m) cin>>u>>v>>w,add(u,v,w);
	l=0,r=1000000;
	while(l<=r){
		ll mid=(l+r)/2;
		ll id=bfs(mid*k);
		if(id!=-1) ans=min(ans,id),r=mid-1;
		else l=mid+1; 
	}
	if(ans==1e18) cout<<-1;
	else cout<<ans;
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...