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 |
Re:……悲剧,这题用tarjan怎么做?In Reply To:……悲剧,这题用tarjan怎么做? Posted by:lwyzdxh at 2010-05-11 19:30:41 #include<stdio.h> #include<string.h> #define MAXN 40000 struct node1 { int to,next,val; }edge[MAXN*9]; struct node2 { int from,to,next,index; }que[MAXN*9]; int n,m,q,cnt1,cnt2; int head1[MAXN],head2[MAXN],fa[MAXN],visit[MAXN],lca[MAXN],dis[MAXN]; char s[99]; void init() { memset(head1,-1,sizeof(head1)); memset(head2,-1,sizeof(head2)); cnt1=cnt2=1; } int find(int v) { if(fa[v]==v) { return fa[v]; } else { fa[v]=find(fa[v]); return fa[v]; } } void addedge(int from,int to,int val) { edge[cnt1].to=to; edge[cnt1].val=val; edge[cnt1].next=head1[from]; head1[from]=cnt1++; } void addque(int from,int to,int index) { que[cnt2].from=from; que[cnt2].to=to; que[cnt2].index=index; que[cnt2].next=head2[from]; head2[from]=cnt2++; } void tarjan(int x) { fa[x]=x; visit[x]=1; int y; for(int i=head1[x];i!=-1;i=edge[i].next) { if(visit[y=edge[i].to]==0) { dis[y]=dis[x]+edge[i].val; tarjan(y); fa[y]=x; } } for(int i=head2[x];i!=-1;i=que[i].next) { if(visit[y=que[i].to]==1) { lca[que[i].index]=find(y); } } } void clear() { memset(fa,0,sizeof(fa)); memset(visit,0,sizeof(visit)); memset(lca,0,sizeof(lca)); memset(dis,0,sizeof(dis)); } int main() { init(); clear(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d%s",&a,&b,&c,s); addedge(a,b,c); addedge(b,a,c); } scanf("%d",&q); for(int i=1;i<=q;i++) { int a,b; scanf("%d%d",&a,&b); addque(a,b,i); addque(b,a,i); } dis[1]=0; tarjan(1); for(int i=1;i<cnt2;i+=2) { int a=que[i].from; int b=que[i].to; int c=que[i].index; printf("%d\n",dis[a]+dis[b]-2*dis[lca[c]]); } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator