蒟蒻莫名RE

P1330 封锁阳光大学

所以您写着BFS。。。
by 小菜鸟 @ 2018-08-28 20:24:42


@[小菜鸟](/space/show?uid=60489) 实则dfs(手动滑稽)
by llwanan @ 2018-08-28 20:26:23


这个搜索函数是不是有点,,, 当n=10000时你的搜索树每层有10000个点,不会爆栈吗?
by 小菜鸟 @ 2018-08-28 20:28:42


你可以参考下我的代码 ```cpp #include<bits/stdc++.h> using namespace std; int n,m,u,v,tot=0,ans,num[3],head[10005],color[10005]; bool flag; struct Edge { int next,to; }; Edge E[200005]; inline void add(int u,int v) { E[++tot].next=head[u]; E[tot].to=v; head[u]=tot; } inline void paint(int now)//从一个点开始向周围涂 { if(flag)return; for(register int i=head[now];i;i=E[i].next) { int v=E[i].to; if(color[v]==color[now]){flag=1;return;} if(!color[v]) { color[v]=3-color[now]; ++num[color[v]]; paint(v); } } } template<class T>inline void read(T &x) { x=0; int s=1; char c=getchar(); while(c<48||c>57){s|=!(c^45);c=getchar();} while(c>47&&c<58){x=(x<<1)+(x<<3)+(c^48);c=getchar();} x=s*x; } int main(int argc,char **argv) { read(n),read(m); for(register int i=0;i<m;++i)read(u),read(v),add(u,v),add(v,u); for(register int i=1;i<=n;i++) if(!color[i]) { color[i]=1; num[1]=1;num[2]=0; paint(i); if(flag) { printf("Impossible\n"); return 0; } else ans+=min(num[1],num[2]); } printf("%d\n",ans); } ``` 大致思路就是题解里的涂色
by 小菜鸟 @ 2018-08-28 20:33:53


@[小菜鸟](/space/show?uid=60489) 已经ac,感谢
by llwanan @ 2018-08-28 21:16:45


|