Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define LL long long
- #define N ((int)1e5 + 8)
- #define MAX ((int)1e9 + 8)
- #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
- using namespace std;
- vector < pair < int , int > > edge[N]; /// edge[i] = list of adjacent nodes of node 'i'
- int col[N];
- vector < int > com[2];
- bool dfs(int n , int c)
- {
- if(vis[n] == 1){
- if(c == col[n]) return 1;
- return 0;
- }
- com[c].push_back(n);
- vis[n] = 1;
- col[n] = c;
- bool res = 1;
- for(auto p:edge[n]){
- int a = p.first , w = p.second;
- res &= dfs(a , c^w);
- }
- return res;
- }
- void Insert(vector < int >& vecA , vector < int >& vecB)
- {
- for(int a:vecA) vecB.push_back(a);
- }
- pair < int , vector < int > > Solve(char finalCol , vector < pair < pair < int , int > , char > >& edges)
- {
- Init(n);
- for(auto p:edges){
- int a = p.first.first , b = p.first.second;
- int w = (p.second != finalCol);
- AddEdge(a , b , w);
- AddEdge(b , a , w);
- }
- vector < int > ans;
- for(int i = 1 ; i <= n ; i++){
- if(vis[i] == 0){
- com[0].clear();
- com[1].clear();
- if(dfs(i , 0) == 0) return {-1,ans};
- if(com[0].size() < com[1].size()) Insert(com[0] , ans);
- else Insert(com[1], ans);
- }
- }
- return {ans.size() , ans};
- }
- int main()
- {
- /// problem link: https://codeforces.com/contest/664/problem/D
- int n , m ;
- cin>>n>>m;
- vector < pair < pair < int , int > , char > > edges;
- while(m--){
- int a , b , w;
- char c;
- cin>>a>>b>>c;
- edges.push_back({{a,b} , c});
- }
- pair < int , vector < int > > ans1 , ans2;
- ans1 = Solve('R' , edges);
- ans2 = Solve('B' , edges);
- if(ans1.first != -1 && ans2.first != -1){
- if(ans1.second.size() < ans2.second.size()) Print(ans1.second);
- else Print(ans2.second);
- }
- else if(ans1.first != -1) Print(ans1.second);
- else if(ans2.first != -1) Print(ans2.second);
- else cout<<"-1\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement