1 solutions

  • 1
    @ 2023-4-29 15:55:25

    首先看到边权为 1,于是想到这道题可以用 bfs 做。

    用 vector 存图,ansans 记录答案,这个部分不用多讲。

    初始化 d1d1d2d2 数组,因为这题点数为 1000,所以初始化为 10000。

    我们先对点 ss 先做一遍 bfs ,用数组 u1u1 记录当前的点记录有没有被遍历到,用队列做一遍 bfs ,用 d1d1 数组记录每个点到 ss 的距离最小值。

    while(q.size()){
    	int k = q.front();
    	q.pop();
    	for(int i = 0;i < v[k].size();i++){
    		int u = v[k][i];
    		if(u2[u]) continue;
    		d2[u] = d2[k] + 1;
    		q.push(u);
    		u2[u] = 1;
    	}
    }
    

    对点 tt 同理做一遍 bfs ,但数组因为不能和点 ss 的相同,所以用 u2u2d2d2 记录。

    然后用 iijj 遍历 1 到 nn,如果当最短路为 s - i - j - ts\text{ - }i\text{ - }j\text{ - }t 时反而比 s - ts\text{ - }t 更短,就把 ansans 加1。

    int dis = min(d1[t],d2[s]);
    for(int i = 1;i <= n;i++){
    	for(int j = i + 1;j <= n;j++){
    		if(mp[i][j]) continue;
    		int w = min(d1[j] + d2[i],d2[j] + d1[i]) + 1;
    		if(w >= dis) ans++;
    	}
    }
    

    最后输出 ansans 即可。

    • 1

    Information

    ID
    5520
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    2
    Accepted
    1
    Uploaded By