[CSP-J 2023] 旅游巴士【民间数据】求调玄关
  • 板块灌水区
  • 楼主AssassinQ
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/10/21 21:28
  • 上次更新2023/11/2 12:07:47
查看原帖
[CSP-J 2023] 旅游巴士【民间数据】求调玄关
409394
AssassinQ楼主2023/10/21 21:28

阻挡我AK路上的一片雾,真的不理解,2小时切完J组,不算快,但是有AK的信心。Dijkstra,80pts,WA on #8~10。玄关三个,真的输了。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5,MAXK=100+5; 
int n,m,k,a,b,c,f[MAXN][MAXK];
bool w[MAXN][MAXK];
vector<int> v[MAXN];
void dijkstra(){
	typedef pair<int,int> pii;
	priority_queue<pii,vector<pii>,greater<pii> > q;
	q.push(make_pair(0,1));
	f[1][0]=0;
	while(!q.empty()){
		pii t=q.top(); q.pop();
		int tx=t.second,ty=t.first;
		if(w[tx][ty%k]) continue;
		w[tx][ty%k]=true;
		for(int i=0;i<v[tx].size();i+=2){
			int to=v[tx][i],s=f[tx][ty%k]+1;
			if(s<v[tx][i+1]) s+=((v[tx][i+1]-s-1)/k+1)*k;
			if(s<f[to][s%k]){
				f[to][s%k]=s;
				q.push(make_pair(s,to));
			}
		}
	}
	return;
}
int main(){
	freopen("bus.in","r",stdin);
	freopen("bus.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&c);
		v[a].push_back(b);
		v[a].push_back(c);
	}
	for(int i=1;i<=n;i++)
		for(int j=0;j<k;j++)
			f[i][j]=0x7fffffff;
	dijkstra();
	if(f[n][0]==0x7fffffff) printf("-1");
	else printf("%d",f[n][0]);
	return 0;
}
2023/10/21 21:28
加载中...