求助大佬为何三个点超时=-=

P1821 [USACO07FEB] Cow Party S

貌似懂了什么=-= AC代码 ```cpp #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,head,tail,len1,len2,maxx=-1,s; int dis1[1001],dis2[1001],team[1001],head1[1001],head2[1001]; bool visited[1001]; struct edge { int next,to,dis; }w1[100001],w2[100001]; void add1(int from,int to,int dis) { w1[++len1].next=head1[from]; w1[len1].to=to; w1[len1].dis=dis; head1[from]=len1; } void add2(int from,int to,int dis) { w2[++len2].next=head2[from]; w2[len2].to=to; w2[len2].dis=dis; head2[from]=len2; } void spfa1() { int i; head=0;tail=1;dis1[s]=0,visited[s]=true;team[1]=s; while(head<tail) { head++; int u=team[head]; visited[u]=false; for(i=head1[u];i!=0;i=w1[i].next) if(dis1[w1[i].to]>dis1[u]+w1[i].dis) { dis1[w1[i].to]=dis1[u]+w1[i].dis; if(!visited[w1[i].to]) { tail++; team[tail]=w1[i].to; visited[w1[i].to]=true; } } } } void spfa2() { int i; head=0;tail=1;dis2[s]=0;visited[s]=true;team[1]=s; while(head<tail) { head++; int u=team[head]; visited[u]=false; for(i=head2[u];i!=0;i=w2[i].next) if(dis2[w2[i].to]>dis2[u]+w2[i].dis) { dis2[w2[i].to]=dis2[u]+w2[i].dis; if(!visited[w2[i].to]) { tail++; team[tail]=w2[i].to; visited[w2[i].to]=true; } } } } int main() { int i,j,x,y,z; cin>>n>>m>>s; for(i=1;i<=m;++i) { cin>>x>>y>>z; add1(y,x,z); add2(x,y,z); } memset(dis1,0x7fffffff/6,sizeof(dis1)); memset(dis2,0x7fffffff/6,sizeof(dis2)); memset(visited,false,sizeof(visited)); spfa1(); memset(visited,false,sizeof(visited)); memset(team,0,sizeof(team)); spfa2(); for(i=1;i<=n;++i) maxx=max(maxx,dis1[i]+dis2[i]); cout<<maxx; } ```
by 养猪大户 @ 2017-08-26 16:20:19


我FOLYD都只超时2个点
by 时崎狂三老公 @ 2017-08-30 14:27:42


@[养猪大户](/space/show?uid=49794) 大佬,请问您的team数组是干什么用的?
by si_zhong @ 2018-07-01 09:46:26


|