結果
| 問題 |
No.1301 Strange Graph Shortest Path
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-27 22:53:26 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,834 bytes |
| コンパイル時間 | 710 ms |
| コンパイル使用メモリ | 56,772 KB |
| 実行使用メモリ | 15,516 KB |
| 最終ジャッジ日時 | 2024-07-26 20:06:00 |
| 合計ジャッジ時間 | 6,596 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 WA * 5 |
ソースコード
#include<cstdio>
#include<queue>
#include<vector>
struct Edge{
int u,v;
long long c,d;
Edge(int u,int v,long long c,long long d):u(u),v(v),c(c),d(d){}
Edge(){}
};
std::vector<int>g[100005];
Edge edge[200005];
int fix[100005];
long long dis[100005];
int inEdge[100005];
int used[200005];
struct Node{
int u;
long long value;
Node(int u,long long value):u(u),value(value){}
bool operator < (const Node& other)const{
return value>other.value;
}
};
long long dijkstra(int s,int t,int n){
for(int i = 1; i <= n; i++) fix[i] = 0, dis[i] = 1e17+7;
std::priority_queue<Node>Q;
dis[s] = 0;
Q.push(Node(s,0));
while(Q.size()!=0){
while(Q.size()!=0 && fix[Q.top().u]==1) Q.pop();
if(Q.size()==0) break;
Node cur = Q.top();
Q.pop();
int u = cur.u;
fix[u] = 1;
for(int e: g[u]){
long long cost = edge[e].c;
int v = edge[e].v;
if(used[e]) cost = edge[e].d;
if(dis[v] > dis[u]+cost){
inEdge[v] = e;
dis[v] = dis[u]+cost;
Q.push(Node(v,dis[v]));
}
}
}
int cur = t;
while(cur!=s){
int ue = inEdge[cur];
int ve = -1;
if(ue%2) ve = ue+1;
else ve = ue-1;
used[ue] = used[ve] = 1;
cur = edge[ue].u;
}
return dis[t];
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int total = 0;
for(int i = 1; i <= m; i++){
int u,v; long long c,d;
scanf("%d%d%lld%lld",&u,&v,&c,&d);
edge[++total] = Edge(u,v,c,d);
g[u].push_back(total);
edge[++total] = Edge(v,u,c,d);
g[v].push_back(total);
}
long long ans = dijkstra(1,n,n);
ans += dijkstra(n,1,n);
printf("%lld\n",ans);
return 0;
}