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 |
为什么超时啊!!!! 有没有人帮帮我!!!!#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #define fou(i,st,ed) for (int i=st;i<=ed;i++) #define fod(i,st,ed) for (int i=st;i>=ed;i--) #define mymin(x,y) (x<y?x:y) #define maxn 100000+100 using namespace std; int lev[maxn],low[maxn],vis[maxn],first[maxn],fa[maxn],bri[maxn]; int N,M,rd,ans,zu; struct adj_list { int to,next; }road[maxn*10]; void ins(int from,int to) { rd++; road[rd].to=to; road[rd].next=first[from]; first[from]=rd; } void init() { rd=0; memset(first,0,sizeof(first)); fou (i,1,M) { int x,y; scanf("%d%d",&x,&y); ins(x,y); ins(y,x); } } void dfs(int x,int dep) { vis[x]=1; lev[x]=low[x]=dep; int flag=1; for (int k=first[x];k;k=road[k].next) { int to=road[k].to; if (fa[x]==to && flag) { flag--; continue; } if (vis[to]==1) low[x]=mymin(low[x],lev[to]); else if (vis[to]==0) { fa[to]=x; dfs(to,dep+1); low[x]=mymin(low[x],low[to]); if (low[to]>lev[x]) { ans++; bri[to]=1; } } } vis[x]=2; } void build() { memset(vis,0,sizeof(vis)); memset(bri,0,sizeof(bri)); memset(fa,0,sizeof(fa)); memset(lev,0,sizeof(lev)); memset(low,0,sizeof(low)); fa[1]=1; ans=0; dfs(1,0); } void LCA(int x,int y) { if (lev[x]<lev[y]) swap(x,y); while (lev[x]>lev[y]) { ans-=bri[x]; bri[x]=0; x=fa[x]; } while (x!=y) { ans-=bri[x]; bri[x]=0; ans-=bri[y]; bri[y]=0; x=fa[x]; y=fa[y]; } } void solve() { zu++; printf("Case %d:\n",zu); int Q; scanf("%d",&Q); while (Q-->0) { int x,y; scanf("%d%d",&x,&y); LCA(x,y); printf("%d\n",ans); } puts(""); } int main() { zu=0; while (scanf("%d%d",&N,&M),N) { init(); build(); solve(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator