| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
好像很多重复递归,加些剪枝,或者干脆开队列,广搜In Reply To:为什么这么慢? Posted by:bakey at 2005-08-09 16:25:32 > 染色那种做法.不会写并查集,会的人愿意指导一下吗? > #include <stdio.h> > #include <string.h> > const int maxn = 2000+5; > int n,m,mat[maxn][maxn],flag[maxn]; > bool ok; > > void paint(int a) > { > int i; > for (i=1;i<=n;i++) > { > if (mat[a][i]==1) > { > if (flag[i]==0) > { > if (flag[a]==1){ > flag[i]=2; > paint(i); > } > else { > flag[i]=1; > paint(i); > } > } > else > { > if (flag[a]==flag[i]) { > ok = false; > return; > } > else continue; > } > } > } > } > > int main() > { > int cases,a,b,c = 0,i; > > scanf("%d",&cases); > while (cases --) > { > c ++; > scanf("%d %d",&n,&m); > memset(mat,0,sizeof(mat)); > for (i = 0 ; i < m;i ++) > { > scanf("%d %d",&a,&b); > mat[a][b]=mat[b][a]=1; > } > memset(flag,0,sizeof(flag)); > ok = true; > for (i=0;i<=n;i++) > { > if (flag[i]==0) > { > flag[i]=1; > paint(i); > } > } > printf("Scenario #%d:\n",c); > if (ok) > printf("No suspicious bugs found!\n\n"); > else > printf("Suspicious bugs found!\n\n"); > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator