//深度优先遍历图,当某个节点的子节点已经访问过,且该节点不是其父节点,肯定存在环
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool dfs(vector <vector<int>>&graph, vector<bool>&visited,int father,int &son,const int start)
{
visited[son] = true;
for (int i = 0; i < graph.size(); i++)
{
//-1代表没有边相连接
if (graph[son][i] != -1 && graph[son][i]!=0 && ((father==-1 && i!=start) || father!=-1 && i!=father) && visited[i] == true) return true;
else if (graph[son][i] != -1 && i != son && visited[i] == false)
{
if (dfs(graph, visited,son,i,start)) return true;
}
}
return false;
}
int main(void)
{
int vexNum;
cin >> vexNum;
vector<vector<int>>graph(vexNum, vector<int>(vexNum, 0));
int temp;
for (int i = 0; i < vexNum; i++)
{
for (int j = 0; j < vexNum; j++)
{
cin >> temp;
graph[i][j] = temp;
}
}
for (int i=0;i<=vexNum-1;i++)
{
graph[i][i] = 0; //节点到自己的距离为0
}
//单从一个节点开始访问,不能保证所有节点都能访问到,需考虑以每个节点为起始点
for (int i = 0; i < vexNum; i++)
{
vector<bool> visited(vexNum, false); //存放节点是否访问,每次都重新初始化
if (dfs(graph, visited, -1,i,i)) { cout << "Yes" << endl; system("pause"); return 0; }
}
cout << "No" << endl;
system("pause");
return 0;
}