結果
問題 | No.416 旅行会社 |
ユーザー |
![]() |
提出日時 | 2017-03-01 19:16:09 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 286 ms / 4,000 ms |
コード長 | 3,465 bytes |
コンパイル時間 | 1,897 ms |
コンパイル使用メモリ | 134,228 KB |
実行使用メモリ | 13,804 KB |
最終ジャッジ日時 | 2024-12-14 20:22:07 |
合計ジャッジ時間 | 6,098 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#pragma region GNUC//以下を参考にした//https://yukicoder.me/wiki/auto_vectorization#ifdef __GNUC__#pragma GCC optimize ("O3")#pragma GCC target ("avx")#endif#pragma endregion#define _USE_MATH_DEFINES#include <iostream>#include <iomanip>#include <stdio.h>#include <sstream>#include <algorithm>#include <cmath>#include <string>#include <cstring>#include <vector>#include <valarray>//#include <array>//x C++ (G++ 4.6.4)#include <queue>#include <complex>#include <set>#include <map>#include <stack>#include <list>#include <cassert>//assert();#include <fstream>#include <random>/////////#define REP(i, x, n) for(int i = x; i < n; ++i)#define rep(i,n) REP(i,0,n)/////////typedef long long LL;typedef long double LD;typedef unsigned long long ULL;#define PII pair<int,int>/////////using namespace::std;// 最大公約数template<class T>inline T gcd(T a, T b){return b ? gcd(b, a % b) : a;}//inline T gcd(T a, T b){return b == 0 ? a : gcd(b, a % b);}// 最小公倍数template<class T>inline T lcm(T a, T b){return a / gcd(a, b) * b;}//inline T lcm(T a, T b){return a * b / gcd(a, b);}////////////////////////////////class UnionFind{public:int cNum;//要素数vector<int> parent;vector< vector<int> > Glist;UnionFind(int n){cNum = n;parent = vector<int>(n);Glist.resize(n);for(int i=n-1;i>=0;--i){parent[i] = i;Glist[i].push_back(i);}}int find(int x){if( parent[x] == x ){return x;}return parent[x] = find( parent[x] );}bool same(int x,int y){return find(x) == find(y);}void add(int x,int y){//unionx = find(x);y = find(y);if( x==y )return;parent[x] = y;if( Glist[y].size() < Glist[x].size() ){swap(Glist[x],Glist[y]);}Glist[y].insert(Glist[y].end(),Glist[x].begin(),Glist[x].end() );}};void solve(){int N,M,Q;cin >> N >> M >> Q;vector<pair<int,int> > GraphEdge(M);for(int i=0;i<M;++i){int A,B;cin >> A >> B;--A;--B;//A<BGraphEdge[i] = make_pair(A,B);}sort( GraphEdge.begin(),GraphEdge.end() );vector<bool> useEdge(M,true);vector<pair<int,int> > AddEdge(Q);vector< pair<int,int> >::iterator vpitr,vpbegin,vpend;vpbegin = GraphEdge.begin();vpend = GraphEdge.end();for(int i=0;i<Q;++i){int C,D;cin >> C >> D;--C;--D;//C<DAddEdge[i] = make_pair(C,D);int index = lower_bound( vpbegin,vpend,AddEdge[i] ) - vpbegin;useEdge[index] = false;}UnionFind uf(N);for(int i=0;i<M;++i){if( !useEdge[i] ) continue;uf.add(GraphEdge[i].first,GraphEdge[i].second);}vector<int> ans(N,0);int root = 0;vector<int>::iterator Litr,Lbegin,Lend;Litr = uf.Glist[uf.find(root)].begin();Lend = uf.Glist[uf.find(root)].end();for(;Litr != Lend;++Litr){ans[*Litr] = -1;}for(int i=Q-1;i>=0;--i){int x = AddEdge[i].first;int y = AddEdge[i].second;if( uf.same(x,y) ) continue;if( uf.same(x,root) ){Litr = uf.Glist[uf.find(y)].begin();Lend = uf.Glist[uf.find(y)].end();}else if( uf.same(y,root) ){Litr = uf.Glist[uf.find(x)].begin();Lend = uf.Glist[uf.find(x)].end();}else{uf.add(x,y);continue;}for(;Litr!=Lend;++Litr){ans[*Litr] = i+1;}uf.add(x,y);}for(int i=1;i<N;++i){cout << ans[i] << endl;}}signed main(void){std::cin.tie(0);std::ios::sync_with_stdio(false);//std::cout << std::fixed;//小数を10進数表示//cout << setprecision(16);//小数点以下の桁数を指定solve();}