为啥会tle

P1342 请柬

XZYQvQ @ 2017-05-06 22:28:51

真没时间调了。。。只能明天再来看了。。。

要是有dalao能帮我看下这个代码为啥会tle就好了。。。

(也可能是我sb没看清题。。。)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
template<typename _Tp>void in(_Tp & dig)
{
    char c=getchar();dig=0;
    while(!isdigit(c))c=getchar();
    while(isdigit(c))dig=dig*10+c-'0',c=getchar();
}
struct node{LL d1,d2;node*nxt;node(){d1=d2=0,nxt=NULL;}};
struct lst
{
    node*begin,*end;
    lst(){begin=end=NULL;}
    void push_back(LL d1,LL d2)
    {
        node*p=new node;p->d1=d1,p->d2=d2;
        if(begin==NULL)begin=end=p;else end=end->nxt=p;
    }
}l[1000005],ul[1000005];
LL n,m,dis1[1000005],dis2[1000005],ans,que[5000005],qh,qt;
bool inque[1000005];
void push(LL d){que[qt++]=d;}
void pop(){qh++;}
int main()
{
    in(n),in(m);
    for(LL i=1,u,v,w;i<=m;i++)
        in(u),in(v),in(w),l[u].push_back(v,w),ul[v].push_back(u,w);
    for(LL i=2;i<=n;i++)dis1[i]=dis2[i]=10000000000000000ll;
    push(1),inque[1]=1;
    while(qh!=qt)
    {
        LL f=que[qh];pop(),inque[f]=0;
        for(node*i=l[f].begin;i!=NULL;i=i->nxt)
            if(dis1[f]+i->d2<dis1[i->d1])
            {
                dis1[i->d1]=dis1[f]+i->d2;
                if(!inque[i->d1])push(i->d1),inque[i->d1]=1;
            }
    }
    qh=qt=0,push(1),inque[1]=1;
    while(qh!=qt)
    {
        LL f=que[qh];pop(),inque[f]=0;
        for(node*i=ul[f].begin;i!=NULL;i=i->nxt)
            if(dis2[f]+i->d2<dis2[i->d1])
            {
                dis2[i->d1]=dis2[f]+i->d2;
                if(!inque[i->d1])push(i->d1),inque[i->d1]=1;
            }
    }
    for(LL i=2;i<=n;i++)ans+=dis1[i]+dis2[i];
    printf("%lld\n",ans);
    return 0;
}

by XZYQvQ @ 2017-05-07 00:20:32

我靠这题卡常数啊!

手打链表不停地new空间就tle了!

只能用数组模拟链表!

AC代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
template<typename _Tp>inline void in(_Tp & dig)
{
    char c=getchar();dig=0;
    while(!isdigit(c))c=getchar();
    while(isdigit(c))dig=dig*10+c-'0',c=getchar();
}
struct graph
{
    int to[1000005],dis[1000005],nxt[1000005],head[1000005],cnt;
    inline graph(){memset(head,-1,sizeof(head)),cnt=0;}
    inline void adde(int u,int v,int w)
    {
        cnt++,to[cnt]=v,dis[cnt]=w,nxt[cnt]=head[u],head[u]=cnt;
    }
};
int n,m,que[5000005],qh,qt;
LL dis[1000005],ans;
graph l,ul;
bool inque[1000005];
inline void push(LL d){que[qt++]=d;}inline void pop(){qh++;}
int main()
{
    in(n),in(m);
    for(int i=1,u,v,w;i<=m;i++)
        in(u),in(v),in(w),l.adde(u,v,w),ul.adde(v,u,w);
    for(int i=2;i<=n;i++)dis[i]=(LL)1e16;
    push(1),inque[1]=1;
    while(qh<qt)
    {
        int f=que[qh];pop(),inque[f]=0;
        for(int i=l.head[f];i!=-1;i=l.nxt[i])
            if(dis[l.to[i]]>dis[f]+l.dis[i])
            {
                dis[l.to[i]]=dis[f]+l.dis[i];
                if(!inque[l.to[i]])push(l.to[i]),inque[l.to[i]]=1;
            }
    }
    qh=qt=0,push(1),inque[1]=1;
    for(int i=2;i<=n;i++)ans+=dis[i],dis[i]=(LL)1e16;
    while(qh<qt)
    {
        int f=que[qh];pop(),inque[f]=0;
        for(int i=ul.head[f];i!=-1;i=ul.nxt[i])
            if(dis[ul.to[i]]>dis[f]+ul.dis[i])
            {
                dis[ul.to[i]]=dis[f]+ul.dis[i];
                if(!inque[ul.to[i]])push(ul.to[i]),inque[ul.to[i]]=1;
            }
    }
    for(int i=2;i<=n;i++)ans+=dis[i];
    printf("%lld\n",ans);
    return 0;
}

by litble @ 2017-05-09 21:36:33

然而我从来都是手打链表,因为蒟蒻不会打真链表.....

所以这题的卡常对我无效啊.....


|