#include<bits/stdc++.h> using namespace std; map<pair<int,int>, bool>mapa, docelowe; vector<int>graf1[30010], graf2[30010]; bool odw[30010]; vector<pair<bool, pair<int,int>>>kra; void polacz(int a, int b){ if(mapa[{a,b}])return; kra.push_back({1, {a,b}}); mapa[{a,b}] = 1; mapa[{b,a}] = 1; } void usun(int a, int b){ if(mapa[{a,b}]){ mapa[{a,b}] = 0; mapa[{b,a}] = 0; kra.push_back({0, {a,b}}); } } void dfs1(int x){ odw[x] = 1; if(x!=1) polacz(1, x); for(auto j: graf1[x]) if(!odw[j]) dfs1(j); } void dfs2(int x){ odw[x] = 0; for(auto j: graf2[x]) if(odw[j]) dfs2(j); if(x!=1 && !docelowe[{x,1}])kra.push_back({0,{1, x}}); } int main() { int n, m, i, a, b; scanf("%d", &n); scanf("%d", &m); for(i=0;i<m;i++){ scanf("%d%d", &a, &b); graf1[a].push_back(b); graf1[b].push_back(a); mapa[{a,b}] = 1; mapa[{b,a}] = 1; } dfs1(1);//polacz wszystkie z 1 for(auto j: mapa){//usun wszystkie krawedzie if(j.first.first!=1 && j.first.second!=1) usun(j.first.first, j.first.second); } scanf("%d", &m); for(i=0;i<m;i++){ scanf("%d%d", &a, &b); docelowe[{a,b}] = 1; docelowe[{b,a}] = 1; graf2[a].push_back(b); graf2[b].push_back(a); if(a!=1 && b!=1) kra.push_back({1, {a,b}}); } dfs2(1); printf("%d\n", (int)kra.size()); for(auto j: kra){ if(j.first==1)printf("+ "); else printf("- "); printf("%d %d\n", j.second.first, j.second.second); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<bits/stdc++.h> using namespace std; map<pair<int,int>, bool>mapa, docelowe; vector<int>graf1[30010], graf2[30010]; bool odw[30010]; vector<pair<bool, pair<int,int>>>kra; void polacz(int a, int b){ if(mapa[{a,b}])return; kra.push_back({1, {a,b}}); mapa[{a,b}] = 1; mapa[{b,a}] = 1; } void usun(int a, int b){ if(mapa[{a,b}]){ mapa[{a,b}] = 0; mapa[{b,a}] = 0; kra.push_back({0, {a,b}}); } } void dfs1(int x){ odw[x] = 1; if(x!=1) polacz(1, x); for(auto j: graf1[x]) if(!odw[j]) dfs1(j); } void dfs2(int x){ odw[x] = 0; for(auto j: graf2[x]) if(odw[j]) dfs2(j); if(x!=1 && !docelowe[{x,1}])kra.push_back({0,{1, x}}); } int main() { int n, m, i, a, b; scanf("%d", &n); scanf("%d", &m); for(i=0;i<m;i++){ scanf("%d%d", &a, &b); graf1[a].push_back(b); graf1[b].push_back(a); mapa[{a,b}] = 1; mapa[{b,a}] = 1; } dfs1(1);//polacz wszystkie z 1 for(auto j: mapa){//usun wszystkie krawedzie if(j.first.first!=1 && j.first.second!=1) usun(j.first.first, j.first.second); } scanf("%d", &m); for(i=0;i<m;i++){ scanf("%d%d", &a, &b); docelowe[{a,b}] = 1; docelowe[{b,a}] = 1; graf2[a].push_back(b); graf2[b].push_back(a); if(a!=1 && b!=1) kra.push_back({1, {a,b}}); } dfs2(1); printf("%d\n", (int)kra.size()); for(auto j: kra){ if(j.first==1)printf("+ "); else printf("- "); printf("%d %d\n", j.second.first, j.second.second); } } |