結果
問題 | No.1382 Travel in Mitaru city |
ユーザー |
![]() |
提出日時 | 2021-02-07 21:30:42 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 93 ms / 2,000 ms |
コード長 | 3,051 bytes |
コンパイル時間 | 1,018 ms |
コンパイル使用メモリ | 102,132 KB |
実行使用メモリ | 12,544 KB |
最終ジャッジ日時 | 2024-07-04 14:48:28 |
合計ジャッジ時間 | 5,476 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 68 |
ソースコード
#include <iostream>#include <string>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <set>#include <map>#include <queue>#include <stack>#include <list>#include <iterator>#include <cassert>#include <numeric>#include <functional>#include <ctime>#pragma warning(disable:4996)//#define ATCODER#ifdef ATCODER#include <atcoder/all>#endiftypedef long long ll;typedef unsigned long long ull;#define LINF 9223300000000000000#define LINF2 1223300000000000000#define LINF3 1000000000000#define INF 2140000000const long long MOD = 1000000007;//const long long MOD = 998244353;using namespace std;#ifdef ATCODERusing namespace atcoder;#endifclass UF{private:int num;vector<int> par;vector<int> siz;public://vector<int> val;public:UF(int n) : num(n) {par.resize(n);siz.resize(n);//val.resize(n);int i;for (i = 0; i < n; i++) {par[i] = i; siz[i] = 1;//val[i]=0;}}int find(int x) {if (x == par[x]) return x;return par[x] = find(par[x]);}void unite(int x, int y) {x = find(x);y = find(y);if (x == y) return;if (siz[x] < siz[y]) {par[x] = y;siz[y] = siz[x] + siz[y];//val[y]=val[x]+val[y];}else {par[y] = x;siz[x] = siz[x] + siz[y];//val[x]=val[x]+val[y];}}bool same(int x, int y) {return find(x) == find(y);}int size(int x) {return siz[find(x)];}int ngroup() {//int ngroup( int& ans ) {int count = 0;int i;for (i = 0; i < num; i++) {if (par[i] == i) {count++;//ans += (val[i]? siz[i]: siz[i]-1);}}return count;}};void solve(){int n, m, s, t;scanf("%d%d%d%d", &n, &m, &s, &t); s--; t--;vector<int> p(n),a(m),b(m);int i,k;for (i = 0; i < n; i++) {scanf("%d", &p[i]);}map<int, vector<int>> z;for (i = 0; i < m; i++) {scanf("%d%d", &a[i], &b[i]); a[i]--; b[i]--;int tmp = min(p[a[i]], p[b[i]]);z[tmp].push_back(i);}UF uf(n);int ans = 0;int pre = 1;auto it = z.rbegin();for (; it != z.rend(); it++) {int tmp = it->first;vector<int>& v = it->second;for (k = 0; k < (int)v.size(); k++) {int id = v[k];uf.unite(a[id], b[id]);}int nn=uf.size(s);//printf("%d\n", nn);if (pre < nn && tmp < p[s]) {ans++;}pre = nn;//if (uf.same(s, t)) break;}printf("%d\n", ans);return;}int main(){#if 1solve();#elseint T, t;scanf("%d", &T);for (t = 0; t < T; t++) {//cout << "Case #" << t + 1 << ": ";solve();}#endifreturn 0;}