站外题求助,20%TLE
  • 板块题目总版
  • 楼主ycs0119
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/16 11:47
  • 上次更新2023/11/3 09:34:13
查看原帖
站外题求助,20%TLE
722439
ycs0119楼主2023/7/16 11:47

第n次发错地方了

题目描述 草儿想坐火车去好多个城市旅游,但可怜的草儿是没有假期的学生党,而且家在一个小镇上,没有火车经过,所以她只能去邻近(可理解距离为0)的城市坐火车。草儿想知道,她去到想去的地方所需要花费的最短时间。

输入描述 第一行三个整数T,S,D表示共有T条双向道路,和草儿家相邻的城市有S个,草儿想去的地方有D个;接下来T行,每行三个整数a,b,time表示城市a,b之间的车程是time小时;接下来一行有S个整数,依次表示和草儿家相连(邻近)的城市编号;接下来一行有D个整数,依次表示草儿想去的城市编号。

输出描述 一个整数,表示草儿到达某个喜欢的城市的最短时间(数据保证,答案≤109)

样例输入

6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10

样例输出

9

数据是随机生成的,所以可能有重边。

蒟蒻想用的是SPFA,但是提交一看数据TLE了20%,是不是SPFA打错了?还是这道题不适合SPFA?

以下是本蒟蒻的代码

#include<bits/stdc++.h>
using namespace std;
 
const int INF=0x3f3f3f3f;
int t,s,d,dis[1100],vis[1100],vvis[1100][1100],D;
int MN=INF;
struct Edge{
    int to,nxt,w;
}edge[21000];
int head[2100],cnt;

void add(int u,int v,int w)
{
    cnt++;
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
void spfa(int s)
{
    for(int i=1;i<=1000;i++)dis[i]=INF;
    dis[s]=0;
    vis[s]=1;
    queue<int>q;
    q.push(s);
    while(!q.empty())
	{
        int start=q.front();
        q.pop();
        vis[start]=0;
        for(int i=head[start];i;i=edge[i].nxt)
            if(dis[edge[i].to]>dis[start]+edge[i].w)
			{
                dis[edge[i].to]=dis[start]+edge[i].w;
                if(!vis[edge[i].to])
				{
                    vis[edge[i].to]=1;
                    q.push(edge[i].to);
                }
            }
    }
}
 
int main()
{
    cin>>t>>s>>d;
    int u,v,w,S;
    for(int i=0;i<t;i++)
	{
        cin>>u>>v>>w;
        if(!vvis[u][v])
		{
        	add(u,v,w),add(v,u,w);
        	vvis[u][v]=vvis[v][u]=cnt;
		}
		else
			edge[vvis[u][v]].w=min(edge[vvis[u][v]].w,w);
    }
    for(int i=1;i<=s;i++)
	{
    	cin>>S;
    	add(S,0,0),add(0,S,0);
	}
    spfa(0);
    for(int i=1;i<=d;i++)
	{
    	cin>>D;
    	MN=min(dis[D],MN);
	}
    cout<<MN;
    return 0;
}
2023/7/16 11:47
加载中...