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
|
#include <iostream>
#include <vector>
#include <initializer_list>
#include <utility>
using namespace std;
class Graph
{
int numNodes;
vector< vector<bool> > adj;
public:
Graph( int N )
{
numNodes = N;
adj = vector<vector<bool>>( N, vector<bool>( N, false ) );
}
int size(){ return numNodes; }
void insert( int a, int b ){ adj[a][b] = true; }
void insert( const initializer_list<pair<int,int>> &L )
{
for ( auto pr : L ) insert( pr.first, pr.second );
}
void flip( int a, int b ){ adj[a][b] = !adj[a][b]; }
void print()
{
cout << "Number of nodes: " << numNodes << '\n';
cout << "Arcs:\n";
for ( int i = 0; i < numNodes; i++ )
{
for ( int j = 0; j < numNodes; j++ ) if ( adj[i][j] ) cout << i << '\t' << j << '\n';
}
}
};
Graph invert( const Graph &G )
{
Graph H = G;
for ( int i = 0; i < H.size(); i++ )
{
for ( int j = 0; j < H.size(); j++ ) if ( i != j ) H.flip( i, j );
}
return H;
}
int main()
{
Graph G( 5 );
G.insert( { {0,1},{0,4},{1,0},{1,4},{2,0},{2,1},{2,3},{2,4},{4,3},{4,1} } );
cout << "Original graph:\n";
G.print();
cout << "\nInverted graph:\n";
invert(G).print();
}
|