1 条题解
-
0
C++ :
#include<cstdio> #include<stack> #include<cstring> #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAXN 2010 using namespace std; int n,b[MAXN],tot,dfn[MAXN],low[MAXN],timeclock,block,belong[MAXN],w[MAXN],tans,ind[MAXN],bb[MAXN]; int f[MAXN][MAXN]; bool flag[MAXN][MAXN],vis[MAXN],insta[MAXN]; stack <int> sta; struct at{ int x,y,last,nex; }a[2*MAXN*MAXN]; void add(int x,int y) { tot++; a[tot].x=x; a[tot].y=y; a[tot].last=b[x]; a[tot].nex=bb[y]; bb[y]=tot; b[x]=tot; } void dfs(int x) { dfn[x]=low[x]=++timeclock; sta.push(x);insta[x]=1; for(int i=b[x];i;i=a[i].last){ if(!dfn[a[i].y]){ dfs(a[i].y); low[x]=MIN(low[x],low[a[i].y]); }else{ if(insta[a[i].y]){ low[x]=MIN(low[x],low[a[i].y]); } } } if(low[x]==dfn[x]){ int now; block++; do{ now=sta.top(); sta.pop();insta[now]=0; belong[now]=block; w[block]++; }while(now!=x); } } void Dfs(int x) { tans+=w[x]; vis[x]=1; for(int i=b[x];i;i=a[i].last){ if(!vis[a[i].y]) Dfs(a[i].y); } return ; } int main() { //freopen("connect.in","r",stdin); //freopen("connect.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x=0; scanf("%1d",&x); if(x==1) add(i,j); } } for(int i=1;i<=n;i++){ if(!dfn[i]){ dfs(i); } } memset(b,0,sizeof(b)); memset(bb,0,sizeof(bb)); int t=tot; for(int i=1;i<=t;i++){ int u=a[i].x,v=a[i].y; if(belong[u]!=belong[v]&&!flag[belong[u]][belong[v]]){ add(belong[u],belong[v]); flag[belong[u]][belong[v]]=1; ind[belong[v]]++; //printf("%d -> %d \n",belong[u],belong[v]); } } long long ans=0; for(int i=1;i<=block;i++){ for(int j=1;j<=block;j++){ if(ind[j]==0){ sta.push(j); ind[j]--; for(int k=b[j];k;k=a[k].last){ ind[a[k].y]--; } break; } } } while(!sta.empty()){ int x=sta.top();sta.pop(); f[x][x/30]|=1<<(x%30); for(int i=bb[x];i;i=a[i].nex){ int y=a[i].x; for(int j=0;j<(block/30+1);j++) f[y][j]|=f[x][j]; } } for(int i=1;i<=block;i++){ int ww=0; for(int j=1;j<=block;j++){ if(f[i][j/30]&1<<(j%30)) ww+=w[j]; } ans+=ww*w[i]; } printf("%lld",ans); getchar();getchar(); return 0; }
- 1
信息
- ID
- 3336
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者