题目链接:http://codeforces.com/problemset/problem/402/E
/**算法分析: 这道题考察了图论基本知识,就是传递闭包,可以构图用强联通分量来判断 */ #include<bits/stdc++.h> #define MAXN 2005 #define PI acos(-1.0) #define REP(i,n) for(int i=0; i<n; i++) #define FOR(i,s,t) for(int i=s; i<=t; i++) #define mem(a,b) memset(a,b,sizeof(a)) #define show(x) { cerr<<">>>"<<#x<<" = "<<x<<endl; } #define showtwo(x,y) { cerr<<">>>"<<#x<<"="<<x<<" "<<#y<<" = "<<y<<endl; } using namespace std; bool G[MAXN][MAXN]; //正向图 bool rG[MAXN][MAXN]; //反向图 vector<int> s; bool vis[MAXN]; int n; void dfs(int u) { vis[u] = true; FOR(i,1,n) if(G[u][i] && !vis[i]) dfs(i); s.push_back(u); } void rdfs(int u) { vis[u] = true; FOR(i,1,n) if(rG[u][i] && !vis[i]) rdfs(i); } bool scc() { s.clear(); mem(vis,0); dfs(1); FOR(i,2,n) if(!vis[i]) return false; mem(vis,0); rdfs(s[n-1]); for(int i=n-2;i>=0; i--) if(!vis[s[i]]) return false; return true; } int main() { //freopen("E:\acm\input.txt","r",stdin); mem(G,0); mem(rG,0); cin>>n; FOR(i,1,n) FOR(j,1,n) { int a; scanf("%d",&a); if(i == j) continue; if(a>0) G[i][j] = true,rG[j][i] = true; } if(scc()) printf("YES "); else printf("NO "); }