1 条题解

  • 0
    @ 2025-11-30 16:28:07

    C++ :

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    
    queue<int> q;
    int rotb1[1001][1001],rotr1[1001][1001];
    int rotb2[1001][1001],rotr2[1001][1001];
    long long mi1[1002],mi2[1002];
    bool d1[1001],d2[1001];
    
    int main()
    {
    	//freopen("party.in","r",stdin);
    	//freopen("party.out","w",stdout);
    	int n,m,k,a,b,r;
    	long long maxx=0;
    	scanf("%d%d%d",&n,&m,&k);
    	for (int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&b,&a,&r);
    		rotb1[a][++rotb1[a][0]]=b;
    		rotr1[a][++rotr1[a][0]]=r;
    		rotb2[b][++rotb2[b][0]]=a;
    		rotr2[b][++rotr2[b][0]]=r;
    	}
    	
    	memset(mi1,127,sizeof(mi1));
    	memset(mi2,127,sizeof(mi2));
    	mi1[k]=mi2[k]=0;
    	
    	q.push(k);
    	while (!q.empty())
    	{
    		int num=q.front();
    		q.pop();
    		d1[num]=false;
    		for (int i=1;i<=rotb1[num][0];i++)
    		{
    			b=rotb1[num][i];
    			r=rotr1[num][i];
    			if (mi1[b]>mi1[num]+r)
    			{
    				mi1[b]=mi1[num]+r;
    				if(!d1[b])
    				{
    					q.push(b);
    					d1[b]=true;
    				}
    			}
    		}
    	}
    	
    	q.push(k);
    	while (!q.empty())
    	{
    		int num=q.front();
    		q.pop();
    		d2[num]=false;
    		for (int i=1;i<=rotb2[num][0];i++)
    		{
    			b=rotb2[num][i];
    			r=rotr2[num][i];
    			if (mi2[b]>mi2[num]+r)
    			{
    				mi2[b]=mi2[num]+r;
    				if(!d2[b])
    				{
    					q.push(b);
    					d2[b]=true;
    				}
    			}
    		}
    	}
    	
    	
    	for (int i=1;i<=n;i++)
    		if(maxx<mi1[i]+mi2[i]&&mi1[i]!=mi1[1001]&&mi2[i]!=mi2[1001])
    			maxx=mi1[i]+mi2[i];
    	
    	printf("%lld",maxx);
    	return 0;
    	
    }
    
    • 1

    信息

    ID
    1455
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者