結果
問題 | No.1565 Union |
ユーザー | もな |
提出日時 | 2021-06-26 13:49:54 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 774 ms / 2,000 ms |
コード長 | 3,278 bytes |
コンパイル時間 | 2,586 ms |
コンパイル使用メモリ | 223,684 KB |
実行使用メモリ | 42,592 KB |
最終ジャッジ日時 | 2024-06-25 10:28:21 |
合計ジャッジ時間 | 13,132 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 138 ms
12,528 KB |
testcase_11 | AC | 399 ms
31,832 KB |
testcase_12 | AC | 322 ms
20,088 KB |
testcase_13 | AC | 106 ms
11,484 KB |
testcase_14 | AC | 518 ms
29,196 KB |
testcase_15 | AC | 747 ms
42,592 KB |
testcase_16 | AC | 743 ms
42,336 KB |
testcase_17 | AC | 774 ms
42,588 KB |
testcase_18 | AC | 757 ms
42,460 KB |
testcase_19 | AC | 758 ms
42,456 KB |
testcase_20 | AC | 344 ms
40,796 KB |
testcase_21 | AC | 344 ms
40,788 KB |
testcase_22 | AC | 344 ms
40,864 KB |
testcase_23 | AC | 341 ms
40,928 KB |
testcase_24 | AC | 344 ms
41,052 KB |
testcase_25 | AC | 347 ms
40,784 KB |
testcase_26 | AC | 341 ms
40,792 KB |
testcase_27 | AC | 347 ms
40,796 KB |
testcase_28 | AC | 347 ms
40,724 KB |
testcase_29 | AC | 345 ms
40,924 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define MOD 1000000007 #define MOD2 998244353 #define rep(i,n) for (int i = 0; i < (int)(n); i++) #define reps(i,s,n) for (int i = (int)(s); i < (int)(n); i++) #define repit(i,C) for (auto i = (C).begin(); i != (C).end(); i++) #define pr(a) cout << a #define prl(a) cout << (a) << endl #define prld(a) cout << setprecision(15)<< (a) << endl #define allrange(a) a.begin(),a.end() template<typename T = int> struct Edge { int src, dst; T weight; Edge(int src, int dst, T weight) : src(src), dst(dst), weight(weight) { }; Edge() {}; }; template<typename T = int> bool operator < (const Edge<T> &e, const Edge<T> &f) { return e.weight != f.weight ? e.weight < f.weight : // コストが低いほう優先 e.src != f.src ? e.src < f.src : e.dst < f.dst; }; template <typename T= int> using Edges = std::vector<Edge<T>>; using Vertexs = std::vector<int>; template<typename T = int> struct Graph { //directed graph Vertexs vertexs; map<int,int> vindex; Edges<T> edges; std::vector< std::vector< std::pair<T,int> >> adjacent_to, adjacent_from; Graph(): vertexs(Vertexs (0)),edges(Edges<T>(0)),vindex(), adjacent_to(std::vector<std::vector<std::pair<T,int>>>(0)), adjacent_from(std::vector<std::vector<std::pair<T,int>>>(0)) {}; void addv(int t){ vertexs.push_back(t); vindex[t]=vertexs.size()-1; adjacent_to.push_back(std::vector<std::pair<T,int>>(0)); adjacent_from.push_back(std::vector<std::pair<T,int>>(0)); } void adde(int s,int d,T w){ edges.push_back(Edge<T>(s,d,w)); adjacent_to.at(vindex[s]).push_back(std::make_pair(w,d)); adjacent_from.at(vindex[s]).push_back(std::make_pair(w,d)); } }; template<typename T = int> struct UndirectedGraph : Graph<T>{ //undirected graph void adde(int s,int d,T w){ this.adde(s,d,w); this.adjacent_to.at(d).push_back(std::make_pair(w,s)); this.adjacent_from.at(d).push_back(std::make_pair(w,s)); } }; /* 2021/06/20 unordered_setを使って拡張可能なデータ構造。 find 所属判定 insert 元の挿入 が平均o(1)で可能。 グループの合併は再帰関数を使用 元の削除はできない */ vector<int> graph_bfs(struct Graph<int>& G,int s=0) { int N = G.vertexs.size(); vector<int> out(N); vector<bool> visited(N); queue<int> work; for(int i=0;i<N;i++) { out[i]=INT_MAX; visited[i]=false; } out[s]=0; work.push(s); while(!work.empty()) { int pt = work.front(); work.pop(); for(auto e:G.adjacent_from[pt]) if(out[e.second]==INT_MAX) out[e.second]=out[pt]+e.first; else out[e.second] = min(out[e.second],out[pt]+e.first); if(visited[pt]) continue; visited[pt]=true; for(auto e:G.adjacent_from[pt]) if(!visited[e.second]) work.push(e.second); } for(int &l:out) if(l==INT_MAX) l=-1; return out; }; int main(){ //1変数入力 int N,M; cin >> N >> M; Graph<int> G; rep(i,N) G.addv(i); rep(i,M){ int u,v; cin >> u >> v; u--;v--; G.adde(u,v,1); G.adde(v,u,1); } auto ans = graph_bfs(G,0); prl(ans[N-1]); }