結果
問題 | No.2805 Go to School |
ユーザー |
|
提出日時 | 2024-07-20 12:52:20 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 259 ms / 2,000 ms |
コード長 | 2,204 bytes |
コンパイル時間 | 4,670 ms |
コンパイル使用メモリ | 104,472 KB |
実行使用メモリ | 39,720 KB |
最終ジャッジ日時 | 2024-07-20 12:52:34 |
合計ジャッジ時間 | 10,738 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include<iostream>#include<vector>#include<queue>#define rep(i,n) for(i=0;i<(int)(n);i++)#define NIL -1using namespace std;typedef long long ll;typedef struct point{int p;ll t;point(int pp=0,ll tt=0):p(pp),t(tt){}}Point;typedef struct data{int p;ll t;bool tol;data(int pp=0,ll tt=0,bool ttol=false):p(pp),t(tt),tol(ttol){}bool operator<(const data& k)const{return t<k.t;}}Data;int n,m,l,s,e;vector<vector<Point> > adj;vector<bool> tol;ll dijk(){Data now,nxt;vector<vector<bool> > visited(2,vector<bool>(n,false));priority_queue<Data> PQ;PQ.push(Data(0,0,false));if(tol[0])PQ.push(Data(0,-s-1,true));while(PQ.size()){do{now=PQ.top();PQ.pop();}while(PQ.size()&&visited[now.tol][now.p]);if(visited[now.tol][now.p])break;//printf("now:(%d,%lld,%d)\n",now.p,-now.t,now.tol?1:0);if(now.tol&&now.p==n-1)return -now.t;visited[now.tol][now.p]=true;for(Point x:adj[now.p]){nxt.p=x.p;nxt.t=now.t-x.t;nxt.tol=now.tol;if(visited[nxt.tol][nxt.p]==false){PQ.push(nxt);//printf("new:(%d,%lld,%d)\n",nxt.p,-nxt.t,nxt.tol?1:0);}if(nxt.tol==false&&tol[nxt.p]){nxt.tol=true;if(s>-nxt.t){nxt.t=-s-1;}else if(-nxt.t<s+e){nxt.t--;}elsecontinue;}if(visited[nxt.tol][nxt.p]==false){PQ.push(nxt);//printf("new:(%d,%lld,%d)\n",nxt.p,-nxt.t,nxt.tol?1:0);}}}return NIL;}int main(){int i,j,k;scanf("%d%d%d%d%d",&n,&m,&l,&s,&e);tol=vector<bool>(n,false);adj=vector<vector<Point> >(n);while(m--){scanf("%d%d%d",&i,&j,&k);i--;j--;adj[i].push_back(Point(j,k));adj[j].push_back(Point(i,k));}while(l--){scanf("%d",&i);i--;tol[i]=true;}printf("%lld\n",dijk());return 0;}