这个为什么有3组超时呀,我裂开了>_< 大家不都这么做的吗。为什么只有70分
查看原帖
这个为什么有3组超时呀,我裂开了>_< 大家不都这么做的吗。为什么只有70分
11018
准图灵奖得主楼主2020/9/8 21:36
#include<iostream>
#include<cstdio>
#include<queue>
       using namespace std;
       const int maxn=1e3+50;
       const int maxm=1e5+50;
       const int inf=0x3f3f3f3f;
       struct edge{
       int u;
	   int v;
	   int w;
	   int next;
	   }e1[maxm],e2[maxn];
	   int head1[maxn],dis1[maxn],inq1[maxn],cnt1=0;
	   int head2[maxn],dis2[maxn],inq2[maxn],cnt2=0;
	   void add1(int u,int v,int w){
       cnt1++;
	   e1[cnt1].u=u;
	   e1[cnt1].v=v;
	   e1[cnt1].w=w;
	   e1[cnt1].next=head1[u];
	   head1[u]=cnt1;
	   }
       void add2(int u,int v,int w){
       cnt2++;
	   e2[cnt2].u=u;
	   e2[cnt2].v=v;
	   e2[cnt2].w=w;
	   e2[cnt2].next=head2[u];
	   head2[u]=cnt2;
	   }
       int n,m,x;
	   void spfa1(int s){
	   for(int i=1;i<=n+1;i++) dis1[i]=inf;
       queue<int>q;
	   q.push(s);
	   dis1[s]=0;
       inq1[s]=1;
	   while(!q.empty()){
	   int u=q.front();
	   q.pop();
	   inq1[u]=0;
	   for(int i=head1[u];i>0;i=e1[i].next){
	   	int v=e1[i].v;
	   	int w=e1[i].w;
	   if(dis1[v]>dis1[u]+w){
	   dis1[v]=dis1[u]+w;
	   if(!inq1[v]){
	   q.push(v);
	   inq1[v]=1;
	   }
	   }
	   }
	   }
	   }
       void spfa2(int s){
	   for(int i=1;i<=n+1;i++) dis2[i]=inf;
       queue<int>q;
	   q.push(s);
	   dis2[s]=0;
       inq2[s]=1;
	   while(!q.empty()){
	   int u=q.front();
	   q.pop();
	   inq2[u]=0;
	   for(int i=head2[u];i>0;i=e2[i].next){
	   	int v=e2[i].v;
	   	int w=e2[i].w;
	   if(dis2[v]>dis2[u]+w){
	   dis2[v]=dis2[u]+w;
	   if(!inq2[v]){
	   q.push(v);
	   inq2[v]=1;
	   }
	   }
	   }
	   }
	   }
	   int read(){
	   int x=0;
	   char c=getchar();
	   while(c<'0'||c>'9') c=getchar();
       while(c>='0'&&c<='9')
	   {
	    x=x*10+(c-'0');
	    c=getchar();
	   }
	   return x;
	   }
	   int main(){
      //freopen("inn.txt","r",stdin);
      //freopen("outt.txt","w",stdout);
	   scanf("%d%d%d",&n,&m,&x);
	   for(int i=1;i<=m;i++){
	   	int u,v,w;
        u=read();
        v=read();
	   	w=read();
        add1(u,v,w);
        add2(v,u,w);
	    }
       spfa1(x);
       spfa2(x);
       int ans=-1;
       for(int i=1;i<=n;i++)
       ans= ans>(dis1[i]+dis2[i]) ? ans : (dis1[i]+dis2[i]);
       printf("%d",ans);
      //fclose(stdin);
      //fclose(stdout);
       return 0;
	   }


2020/9/8 21:36
加载中...