有向图判环

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

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

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

样例输入:

[[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 }

原文地址:https://www.cnblogs.com/liugl7/p/11272614.html

时间: 2024-10-12 02:39:51

有向图判环的相关文章

HDU 5154 Harry and Magical Computer 有向图判环

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访问过的节点标记为0,如果访问到-1的节点说明说有环. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 t

COJ 3012 LZJ的问题 (有向图判环)

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1042 试题描述: LZJ有一个问题想问问大家.他在写函数时有时候很头疼,如他写了这样几个函数: void f1(){   f2();   f3();}void f2(){   f3();}void f3(){   f1();}LZJ发现他无论怎么调换函数的位置,编译器总是不能通过编译,因为编译器规定调用的函数必须在当前函数之前写.还有一种情况是这样的:void f4(){

CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS

题意: 一种游戏,2个人轮流控制棋子在一块有向图上移动,每次移动一条边,不能移动的人为输,无限循环则为平局,棋子初始位置为$S$ 现在有一个人可以同时控制两个玩家,问是否能使得第一个人必胜,并输出一个解,否则判断是否能平局 题解: 看到这个题首先我想到了强连通分量,但是事实证明求出强连通分量,缩点对解决问题没有什么帮助.... 能写一些看似正确的算法,但其实是假算法来的.. ........... 所以应该先分析策略,肯定是能赢就赢,不能赢就求平局,最后才算输 平局很好判断,有向图上,从$S$点

有向图判环+拆解图求参会期望 SRM 660 Div1 Medium: Privateparty

题意:N个参加聚会,和一个数组a,ai表示第i个人讨厌的人,如果一个到聚会门口的时候发现他讨厌的人已经在聚会里面,则他不会参加聚会,否则他会参加聚会.ai==i表示他没有讨厌的人.N个人来的先后顺序是任意的,也就是说n个来的先后顺序构成的1到n的排列是任意的.问参加聚会的人的期望是多少? Privateparty Problem Statement Hero is inviting his friends to the party. He has n friends, numbered 0 th

SDNU 1089.拓扑排序(拓扑判环小顶堆)

Description 给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE. Input 第一行为两个整数n(1<=n<=1000).m(1<=m<=100000): 之后m行,每行两个整数a.b(0 < a, b <= n)表示一条从a到b的有向边. Output 若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的. Sample Input 5 4 1 2 2 3 3 4 4 5

HDOJ 5154 Harry and Magical Computer floyd判环

floyd判环 Harry and Magical Computer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1005    Accepted Submission(s): 404 Problem Description In reward of being yearly outstanding magic student, H

POJ 2240 Arbitrage (spfa判环)

Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Frenc

poj2240 Arbitrage (spfa判环)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10997   Accepted: 4622 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

hdu 4324 Triangle LOVE(拓扑判环)

Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 3603    Accepted Submission(s): 1416 Problem Description Recently, scientists find that there is love between any of two people. Fo