bzoj P2208
这道题的正解应该是Tarjan+装压,但是像我这样的弱鸡用暴力也过了(无任何优化哦)。。
首先建图,这里使用vector来储存,也可以选择邻接矩阵和邻接表来存;
然后根据题意,枚举每个点,开始爆搜,判断能够到达几个点(因为这里是有向图,所以不用管什么重复)
ans记录一遍,就过了。。。
需要注意的是,一个点到自己也算,所以每次更新都要加1
#include<bits/stdc++.h> using namespace std; int n,vis[2010],ans; char x; vector<int> v[2010]; int dfs(int x){ int cnt=0; for(int i=0;i<v[x].size();i++) if(!vis[v[x][i]]){ vis[v[x][i]]=1; cnt+=dfs(v[x][i])+1; } return cnt; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ getchar(); for(int j=1;j<=n;j++){ x=getchar(); if(x=='1') v[i].push_back(j); } } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); vis[i]=1; ans+=dfs(i)+1; } printf("%d",ans); return 0; }