結果
問題 | No.2805 Go to School |
ユーザー | Kou0406 |
提出日時 | 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 -1 using 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--; }else continue; } 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; }