5分求助
查看原帖
5分求助
398152
MinimumSpanningTree最小生成树楼主2023/11/24 22:19

样例没过

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N=1e4+100,M=2e4+100,K=110,INF=0x3f3f3f3f;
int n,m,k,u,v,a,t[N],bk,dp[N][K],tim;
struct node1
{
	int id,last,val;
}b[M];
struct node2
{
	int qid,qtime;
}qt;
bool operator < (const node2& a1,const node2& a2)
{
	return a1.qtime<a2.qtime;
}
priority_queue<node2> q;
void add(int a1,int a2,int a3)
{
	b[++bk].id=a2;
	b[bk].last=t[a1];
	b[bk].val=a3;
	t[a1]=bk;
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++) 
	{
		scanf("%d%d%d",&u,&v,&a);
		add(u,v,a);
	}
	memset(dp,0x3f,sizeof dp);
	q.push({1,0});
	dp[1][0]=0;
	while(!q.empty())
	{
		qt=q.top();
		q.pop();
		if(qt.qtime>=dp[qt.qid][qt.qtime%k]) continue;
		for(int i=t[qt.qid];i;i=b[i].last)
		{
			tim=qt.qtime;
			if(tim+1<b[i].val) tim+=(b[i].val-tim-1+k)/k*k; 
			if(tim+1<dp[b[i].id][(tim+1)%k])
			{
				dp[b[i].id][(tim+1)%k]=tim+1;
				q.push({b[i].id,tim+1});
			}
		}
	}
	dp[n][0]<INF?printf("%d",dp[n][0]):printf("-1");
	return 0;
}
2023/11/24 22:19
加载中...