1 solutions

  • 0
    @ 2024-12-10 23:09:55

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct node
    {
    	int to;//终点位置
    	int next;//同一起点的下一条边存储在edge数组中的位置(理解了这个静态邻接表就可以了)
    	int data; //权值
    };
    int n,p,c,m,len,dis[100001];
    int head[100001]={0};//以该点为起点的第一条边存储在edge数组中的位置
    node a[10000001];
    void insert(int,int);
    void spfa(int);
    void init();
    int main()
    {
    	//freopen("candy10.in","r",stdin);
    	init();
    	spfa(c);
    	int tot=0;
    	for(int i=1;i<=n;i++)if(dis[i]>tot) tot=dis[i];
    	cout<<tot+m+1<<endl;
    	return 0;
    }
    void insert(int x,int y)
    {
    	len++;
    	a[len].to=y;
    	a[len].data=1;
    	a[len].next=head[x];
    	head[x]=len;
    }
    void init()
    {
    	cin>>n>>p>>c;
    	cin>>m;
    	for(int i=1;i<=p;i++)
    	{
    		int x,y;
    		cin>>x>>y;
    		insert(x,y);
    		insert(y,x);
    	}
    }
    void spfa(int x)
    {
    	queue<int> q;
    	bool flag[100001]={0};
    	memset(dis,0x7f,sizeof(dis));
    	dis[x]=0;
    	q.push(x);
    	flag[x]=1;
    	while(!q.empty())
    	{
    		int k=q.front();
    		for(int i=head[k];i!=0;i=a[i].next)
    		{
    			int t=a[i].to;
    			if(dis[t]>dis[k]+a[i].data)
    			{
    				dis[t]=dis[k]+a[i].data;
    				if(!flag[t])
    				{
    					q.push(t);
    					flag[t]=true;
    				}
    			}
    		}
    		flag[k]=false;
    		q.pop();
    	}
    }
    
    • 1

    Information

    ID
    586
    Time
    2000ms
    Memory
    256MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By