1 条题解
-
224陈泓凯 (12134陈泓凯) LV 10 @ 2024-01-06 14:17:34
之前写的代码太极限了,时间几乎到了1s勉强过的
#include<bits/stdc++.h> #define int long long using namespace std; struct st { int nxt,a; }; int n,m,k,arr[10001][1001]; vector<st> nt[10001]; int fcc(int x,int y)//函数调用需要极小时间,但不影响超时问题 { if(x<y)return (y-x+k-1)/k*k+x+1; return x+1; } signed main() { ios::sync_with_stdio(false); memset(arr,0x0f0f,sizeof arr); cin>>n>>m>>k; for(int i=1;i<=m;i++) { int x;st y; cin>>x>>y.nxt>>y.a; nt[x].push_back(y); } queue<int> l,t; l.push(1);t.push(0); while(!l.empty()) { int x=l.front(),ti=t.front(); l.pop();t.pop(); if(ti>=arr[x][ti%k])continue;//这边每次等到放入队列再判断,太耗时 arr[x][ti%k]=ti; for(int i=0;i<nt[x].size();i++) { int tl=fcc(ti,nt[x][i].a),ls=nt[x][i].nxt; t.push(tl); l.push(ls); } } if(arr[n][0]!=arr[0][0])cout<<arr[n][0]<<endl; else cout<<-1<<endl; return 0; }
现在改了,用时差不多才130ms。
#include<bits/stdc++.h> #define int long long using namespace std; struct st { int nxt,a; }; int n,m,k,arr[10001][1001]; vector<st> nt[10001]; signed main() { ios::sync_with_stdio(false); memset(arr,0x0f0f,sizeof arr); cin>>n>>m>>k; for(int i=1;i<=m;i++) { int x;st y; cin>>x>>y.nxt>>y.a; nt[x].push_back(y); } queue<int> l,t; l.push(1);t.push(0); arr[1][0]=0; while(!l.empty()) { int x=l.front(),ti=t.front(); l.pop();t.pop(); if(ti>arr[x][ti%k])continue;//保证时间为最小值 for(int i=0;i<nt[x].size();i++) { int tl=(ti<nt[x][i].a?(nt[x][i].a-ti+k-1)/k*k+ti+1:ti+1),ls=nt[x][i].nxt;//修改函数,取消函数调用时间 if(tl<arr[ls][tl%k])//若用时最小,则放入队列 { arr[ls][tl%k]=tl;//之前此点此时的时间可能较大,但是由于上面continue掉了,无需弹出 l.push(ls); t.push(tl); } } } if(arr[n][0]!=arr[0][0])cout<<arr[n][0]<<endl; else cout<<-1<<endl; return 0; }
- 1
信息
- ID
- 2475
- 难度
- 9
- 分类
- (无)
- 标签
- 递交数
- 13
- 已通过
- 3
- 通过率
- 23%
- 上传者