Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. int const MAXN = 1000;
  5. int A[MAXN][MAXN];
  6. int visited[MAXN];
  7. int n,m,directed;
  8. vector<int> connected;
  9.  
  10. void readGraph (){
  11.     printf ("Is the graph Directed or Undirected ? [1/0]: ");
  12.     scanf ("%d",&directed);
  13.     printf ("Number of graph nodes: ");
  14.     scanf ("%d",&n);
  15.     printf ("Number of graph edges: ");
  16.     scanf ("%d",&m);
  17.     printf("Enter the %d edges:\n",m);
  18.     printf ("Edge u -> v : \n");
  19.     for (int i=0;i<m;i++){
  20.         int u,v;
  21.         printf("Enter u and v \n ");
  22.         scanf ("%d %d",&u,&v);
  23.  
  24.         A[u][v]=1;
  25.         if (directed==0) A[v][u]=1;
  26.     }
  27. }
  28. void displayGraph (){
  29.     printf ("Adjacency matrix : \n");
  30.     printf ("      ");
  31.     for (int i =1;i<=n;i++)
  32.         printf (" %2d  ",i);
  33.     puts("");
  34.     for (int i=1;i<=n;i++){
  35.         printf (" %2d | ",i);
  36.         for (int j=1;j<=n;j++)
  37.             printf (" %2d  ",A[i][j]);
  38.         puts("");
  39.     }
  40. }
  41. void order(){
  42.     printf ("Graph order: %2d \n",n);
  43. }
  44. void numberOfLinks(){
  45.     printf ("Number of links: %2d \n",m);
  46. }
  47. void density(){
  48.     printf ("Graph density: %2f \n",2*m/((double)n*(n-1)));
  49. }
  50. int outDegree (int s){
  51.     int out=0;
  52.     for (int i=1;i<=n;i++)
  53.         out+=A[s][i];
  54.     return out;
  55. }
  56. int inDegree (int s){
  57.     int in=0;
  58.     for (int i=1;i<=n;i++)
  59.         in+=A[i][s];
  60.  
  61.     return in;
  62. }
  63. void degree(){
  64.     int s;
  65.     printf ("Enter the summet: ");
  66.     scanf("%d",&s);
  67.     if (directed){
  68.         int out= outDegree(s);
  69.         int in = inDegree(s);
  70.         printf ("The outdegree of summet %2d is %2d\n",s,out);
  71.         printf ("The indegree of summet %2d is %2d\n",s,in);
  72.         printf ("The degree of summet %2d is %2d\n",s,in+out);
  73.         return;
  74.     }
  75.     int d=0;
  76.     for (int i=1;i<=n;i++)
  77.         d+=A[s][i];
  78.     printf ("The degree of summet %2d is %2d\n",s,d);
  79. }
  80. int countDegree(int s){
  81.     int d=0;
  82.     for (int i=1;i<=n;i++)
  83.         d+=A[s][i];
  84.     return d;
  85. }
  86. void voisinageSortant (int s){
  87.     vector<int> v;
  88.     for (int i=1;i<=n;i++){
  89.         if (A[s][i]) v.push_back(i);
  90.     }
  91.     printf ("Le voisinage sortant du sommet %2d est [",s);
  92.     for(int i=0; i<  static_cast<int>(v.size()); i++)
  93.         if (i==(int)v.size()-1)
  94.             printf ("%d]\n",v[i]);
  95.         else printf("%d,",v[i]);
  96.     if (v.size()==0){
  97.         printf ("]\n");
  98.     }
  99. }
  100. void voisinageEntrant (int s){
  101.     vector<int> v;
  102.     for (int i=1;i<=n;i++){
  103.         if (A[i][s]) v.push_back(i);
  104.     }
  105.     printf ("Le voisinage entrant du sommet %2d est [",s);
  106.     for (int i=0;i<  static_cast<int>(v.size());i++)
  107.         if (i==(int)v.size()-1)
  108.             printf ("%d]\n",v[i]);
  109.         else printf("%d,",v[i]);
  110.     if (v.size()==0){
  111.         printf ("]\n");
  112.     }
  113. }
  114. void voisinage (){
  115.     int s;
  116.     printf ("Enter the summet: ");
  117.     scanf("%d",&s);
  118.     if (directed){
  119.         voisinageSortant(s);
  120.         voisinageEntrant(s);
  121.     }
  122.     vector<int> v;
  123.     for (int i=1;i<=n;i++){
  124.         if (A[s][i] or A[i][s]) v.push_back(i);
  125.     }
  126.     printf ("Le voisinage du sommet %2d est [",s);
  127.     for (int i=0;i<  static_cast<int>(v.size());i++)
  128.         if (i==(int)v.size()-1)
  129.             printf ("%d]\n",v[i]);
  130.         else printf("%d,",v[i]);
  131. }
  132. bool isSimple(){
  133.     //A simple graph is a graph which contains no loops and no parallel arcs
  134.     bool simple=true;
  135.     //We verify that there's no loops
  136.     for (int i=1;i<=n;i++)
  137.         if (A[i][i]) simple=false;
  138.     return simple;
  139. }
  140. bool isComplete(){
  141.     return isSimple() && (m==(n*(n-1))/2);
  142. }
  143. bool isConnexe(){
  144.     bool connexe=true;
  145.     memset(visited,0,sizeof visited);
  146.     queue<int> q;
  147.     q.push (1);
  148.     while (!q.empty()){
  149.         int node=q.front();
  150.         q.pop();
  151.         visited[node]=1;
  152.         for (int i=1;i<=n;i++){
  153.             if (!visited[i] && A[node][i])
  154.                 q.push(i);
  155.         }
  156.     }
  157.     for (int i=1;i<=n;i++)
  158.         if (!visited[i]) connexe=false;
  159.     return connexe;
  160. }
  161. bool isHamiltonian(){
  162.     return false;
  163. }
  164. bool isEulerian (){
  165.    
  166.     if (directed){
  167.         for(int i=1;i<=n;i++)
  168.             if (!(outDegree(i)==inDegree(i)))return false ;
  169.     }
  170.     else {
  171.         for (int i=1;i<=n;i++)
  172.             if (countDegree(i)%2) return false;
  173.     }
  174.     return true;
  175. }
  176. void properties(){
  177.     printf ("Graph A is ");
  178.     if (!directed) printf ("not ");
  179.     printf ("directed, ");
  180.     if (!isSimple()) printf ("not ");
  181.     printf ("simple, ");
  182.     if (!isComplete()) printf ("not ");
  183.     printf ("complete, ");
  184.     if (!isEulerian()) printf ("not ");
  185.     printf ("Eulerian, ");
  186.     if (!isHamiltonian()) printf ("not ");
  187.     printf ("hamiltonian and ");
  188.     if (!isConnexe()) printf ("not ");
  189.     if (!isConnexe() && directed ) printf ("forcefully ");
  190.     printf ("connexe\n");
  191. }
  192. void dfs (int node){
  193.     connected.push_back(node);
  194.     visited[node]=1;
  195.     for (int i=1;i<=n;i++)
  196.         if (!visited[i] && A[node][i])
  197.             dfs(i);
  198. }
  199. void bfs (int source){
  200.     queue<int> q;
  201.     q.push (source);
  202.     while (!q.empty()){
  203.         int node=q.front();
  204.         q.pop();
  205.         if (!visited[node])
  206.             connected.push_back(node);
  207.         visited[node]=1;
  208.         for (int i=1;i<=n;i++){
  209.             if (!visited[i] && A[node][i])
  210.                 q.push(i);
  211.         }
  212.     }
  213. }
  214. void parcoursProfondeurGraphe(){
  215.     memset(visited,0,sizeof visited);
  216.     int nbr=0;
  217.     for (int i=1;i<=n;i++){
  218.         if (!visited[i]){
  219.             connected.clear();
  220.             nbr++;
  221.             dfs(i);
  222.             printf ("The elements of %d composant connexe : ",nbr);
  223.             for (int j=0; j< static_cast<int>(connected.size());j++)
  224.                 printf ("%2d ",connected[j]);
  225.             puts("");
  226.         }
  227.     }
  228. }
  229. void parcoursLargeurGraphe(){
  230.     memset(visited,0,sizeof visited);
  231.     int nbr=0;
  232.     for (int i=1;i<=n;i++){
  233.         if (!visited[i]){
  234.             connected.clear();
  235.             nbr++;
  236.             bfs(i);
  237.             printf ("les elements du %d composant connexe : ",nbr);
  238.             for (int j=0;j< static_cast<int>(connected.size());j++)
  239.                 printf ("%2d ",connected[j]);
  240.             puts("");
  241.         }
  242.     }
  243. }
  244. int main (){
  245.     readGraph();
  246.     displayGraph();
  247.     order();
  248.     numberOfLinks();
  249.     density();
  250.     degree();
  251.     voisinage();
  252.     properties();
  253.     parcoursProfondeurGraphe();
  254.     parcoursLargeurGraphe();
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement