| ||||||||||
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 |
想写个BFS版本的,却TLE了,求大神帮忙看看T^T#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <ctype.h> #include <vector> #include <algorithm> #include <set> #include <utility> #include <stack> #include <queue> #include <sstream> #include <cmath> #include <time.h> #include <map> using namespace std; #define rep(i,n) for(int i=0; i<n; i++) #define repe(i,n) for(int i=1; i<=n; i++) #define mst(A,k) memset(A,k,sizeof(A)) typedef long long ll; const int INF = 200000000; const double inf = 1e13; const ll MOD = 1000000007; const double eps = 1e-9; const int N = 550; const int M = 10010; int n,k; int fst[N],nxt[M],v[M],tol; int link[N],use[N],pa[N]; void edge(int a,int b) { v[tol] = b; nxt[tol] = fst[a]; fst[a] = tol++; } bool Find(int s) { queue<int> Q; Q.push(s); while(!Q.empty()) { int u = Q.front();Q.pop(); for(int e=fst[u]; ~e; e=nxt[e])if(!use[v[e]]) { use[v[e]] = 1; pa[v[e]] = u; if(link[v[e]] != -1) { Q.push(link[v[e]]); pa[link[v[e]]] = v[e]; } else { int d = v[e]; link[d] = pa[d]; d = pa[d]; while(d != s) { d = pa[d]; link[d] = pa[d]; d = pa[d]; } return true; } } } return false; } int main() { //freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout); int r,c; while(~scanf("%d%d",&n,&k)) { tol = 0; mst(fst,-1); rep(i,k) { scanf("%d%d",&r,&c); edge(r,c); } mst(link,-1); int ans = 0; for(int i=1; i<=n; i++) { mst(use,0); if(Find(i)) ans++; } printf("%d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator