COJ1128(Download Station)
题目大意是给定一个有向图,求最少需添加多少条有向边使得原图强连通。可以先求强连通分量,统计缩点后的图中入度为0的点和出度为0的点,答案就是两者中的较大者,需要注意的是当原图是强连通时,直接输出0。因为没有初始化WA了一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <stdio.h> #include <string.h> #define CLR(a) (memset(a,0,sizeof(a))) #define N 100 char g[N][N],vis[N]; int n; int ord[N],id[N],cnt,din[N],dout[N]; void dfs( int u) { int v; vis[u]=1; for (v=0;v<n;v++) { if (g[u][v]&&!vis[v]) dfs(v); } ord[cnt++]=u; } void rdfs( int u) { int v; vis[u]=1,id[u]=cnt; for (v=0;v<n;v++) { if (g[v][u]&&!vis[v]) rdfs(v); } } void kosaraju() { int i,j,t,a,b; CLR(vis); for (i=0,cnt=0;i<n;i++) { if (!vis[i]) dfs(i); } CLR(vis); for (t=n-1,cnt=0;t>=0;t--) { i=ord[t]; if (!vis[i]) { rdfs(i),cnt++; } } CLR(din),CLR(dout); for (i=0;i<n;i++) { for (j=i+1;j<n;j++) { if ((id[i]^id[j]) && (g[i][j] || g[j][i])) { dout[id[i]]+=g[i][j],din[id[j]]+=g[i][j]; dout[id[j]]+=g[j][i],din[id[i]]+=g[j][i]; } } } for (i=0,a=0,b=0;i<cnt;i++) a+=dout[i]==0?1:0,b+=din[i]==0?1:0; if (cnt==1) printf ( "0\n" ); else printf ( "%d\n" ,a>b?a:b); } int main() { int i,j; while (~ scanf ( "%d" ,&n)) { CLR(g); for (i=0;i<n;i++) { while ( scanf ( "%d" ,&j)&&j) g[i][j-1]=1; } kosaraju(); } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· ShadowSql之.net sql拼写神器
· Excel百万数据如何快速导入?
· 无需WebView,Vue也能开发跨平台桌面应用