Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我的tarjan把usaco测试数据全部过了,为什么还是wa阿?过路的牛人们帮忙看看阿!!不胜感激

Posted by dut200901102 at 2010-07-03 14:46:47 on Problem 1986
>>rt

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

const int MAX=100010;

struct node{
    int to;
    int weigh;
    int next;
    int ans;
}edges[MAX],que[MAX];
int box1[MAX],box2[MAX];
bool flag[MAX],visit[MAX];

int n,m,p[MAX],dis[MAX];

int find_set(int x)
{
    if(p[x]!=x)
    {
        p[x]=find_set(p[x]);
    }
    return p[x];
}

void lca(int x)
{
    int u,e;
             visit[x]=true;
    p[x]=x;
    for(int i=box1[x];i!=-1;i=edges[i].next)
    {
        u=edges[i].to;
        if(!visit[u])
        {
            dis[u]=dis[x]+edges[i].weigh;
            lca(u);
            p[u]=x;
        }
    }
    flag[x]=true;
    for(int i=box2[x];i!=-1;i=que[i].next)
    {
        u=que[i].to;
        if(flag[u])
        {
            e=find_set(u);
            que[i].ans=dis[u]+dis[x]-2*dis[e];
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int a,b,d,s,k;
    char c[3];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(box1,-1,sizeof(box1));
        memset(box2,-1,sizeof(box2));
        memset(flag,false,sizeof(flag));
        memset(visit,false,sizeof(visit));
        s=0;
        for(int i=0;i<m;++i)
        {
            scanf("%d%d%d%s",&a,&b,&d,c);
            edges[s].to=b;
            edges[s].weigh=d;
            edges[s].next=box1[a];
            box1[a]=s++;
            edges[s].to=a;
            edges[s].weigh=d;
            edges[s].next=box1[b];
            box1[b]=s++;
        }
        scanf("%d",&k);
        s=0;
        for(int i=0;i<k;++i)
        {
            scanf("%d%d",&a,&b);
            que[s].to=b;
            que[s].ans=0;
            que[s].next=box2[a];
            box2[a]=s++;
            que[s].to=a;
            que[s].ans=0;
            que[s].next=box2[b];
            box2[b]=s++;
        }
        dis[1]=0;
        lca(1);
        for(int i=0;i<s;++i)
        {
            if(que[i].ans)
            printf("%d\n",que[i].ans);
        }
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator