Source:
http://soj.sysu.edu.cn/show_problem.php?pid=1003&cid=2127
Description
输入一个有向图,判断该图是否是有向无环图(Directed Acyclic Graph)。
Sample Input
输入的第一行包含两个整数n和m,n是图的顶点数,m是边数。1<=n<=100,0<=m<=10000。
接下来的m行,每行是一个数对u v,表示存在有向边(u,v)。顶点编号从1开始。
3 3
1 2
2 3
3 1
Sample Output
如果图是DAG,输出1,否则输出0
0
Caution:
水题。可以拓扑排序也可以bfs,我用的是bfs
示例代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include <vector>
using namespace std;
int n, m, u, v;
vector<int> g[10001];
bool vis[10001];
void init()
{
cin >> n >> m;
for (int i = 0; i < m; ++i)
{
cin >> u >> v;
g[u].push_back(v);
}
}
bool bfs(int s)
{
queue<int> q;
q.push(s);
while (!q.empty())
{
int u = q.front();
for (int i = 0; i < g[u].size(); ++i)
{
if (!vis[g[u][i]])
{
vis[g[u][i]] = 1;
q.push(g[u][i]);
if (s == g[u][i])
return false;
}
}
q.pop();
}
return true;
}
void work()
{
int ans = 1;
for (int i = 1; i < n; ++i)
if (!bfs(i))
{
ans = 0;
break;
}
cout << ans << endl;
}
int main()
{
init();
work();
return 0;
}