zoukankan      html  css  js  c++  java
  • 有向图判环

    有这样一道编程面试题,给一个有向图的邻接矩阵,判别它是否有环。

    题目麻烦在给的邻接矩阵是以 ‘字符输入流’ 的形式给出的,所以将其处理成数字形式的是首先要做的工作。

    得到邻接矩阵之后,进行拓扑排序即可。假如能完成拓扑排序那就无环,如果不能,那就是有环。

    样例输入:

    [[0, 1, 0], [0, 0, 1], [1, 0, 0]]

    [[0, 0, 0, 1, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0]]

    输出:(1代表有环,0代表无环)

    1

    0

     1 #include <bits/stdc++.h> 
     2 using namespace std; 
     3 
     4 int main(int argc, char const *argv[]){
     5     string str;
     6     while(getline(cin, str) ){        
     7         vector<int> data;
     8         for(int i=0; i<str.size(); i++){
     9             if(str[i]=='0' || str[i]=='1'){
    10                 data.push_back(str[i]-'0');
    11             }            
    12         }
    13                 
    14         int n = sqrt( data.size() );                      //n是节点个数
    15         vector<vector<int> > graph(n,vector<int>(n,0));   //邻接矩阵 
    16         
    17         for(int i=0; i<n; i++){
    18             for(int j=0; j<n; j++){ 
    19                 graph[i][j] = data[n*i+j];
    20             } 
    21         }
    22         
    23         vector<int> visited(n,0);    //n是节点个数,从上面处理后得到
    24         vector<int> indegree(n,0);   //各个节点的入度
    25         for(int i=0;i<n;i++){
    26             for(int j=0;j<n;j++){
    27                 if(graph[i][j]==1){
    28                     indegree[j]++;
    29                 }                
    30             }
    31         } 
    32         queue<int> q;
    33         for(int i=0;i<n;i++){
    34             if(indegree[i]==0) 
    35                 q.push(i);
    36         }
    37         
    38         int now;
    39         while(!q.empty()){
    40             now = q.front();
    41             q.pop();
    42             visited[now] = 1;
    43             for(int i=0;i<n;i++){
    44                 if(!visited[i] && graph[now][i]==1){
    45                     indegree[i]--;
    46                     if(indegree[i]==0) q.push(i); 
    47                 }
    48             }
    49         }
    50         
    51         bool sign = 0;
    52         for(int i=0; i<n; i++){
    53             if(!visited[i]){
    54                 sign = 1;
    55                 break;
    56             }            
    57         }
    58         
    59         cout<<sign<<endl;
    60     } 
    61         
    62     return 0;
    63 }
  • 相关阅读:
    pycharm的一些操作指令和技巧
    Python开发:模块
    python字符编码
    Pyhton开发:Python基础杂货铺
    Python之函数
    python介绍
    记录
    HDOJ3699 A hard Aoshu Problem[暴力]
    HDOJ3697 Selecting courses[贪心]
    HDOJ4054 Hexadecimal View[编码题]
  • 原文地址:https://www.cnblogs.com/liugl7/p/11272614.html
Copyright © 2011-2022 走看看