题解:
由于(2≤n≤105,0≤m≤5⋅105,1≤a,b≤109),且题目分为两种边,其实即为一张图和其补图,图上为m条边且边长为a,补图的边很大,所以关键在于如何遍历补图。由于我们只需要找出一条最短路,且每个点最多遍历一次,所以可以用set来扩展边,可以极大的缩小复杂度。
AC code
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;
const int maxm = 5e5 + 10;
int n,m,a,b;
set <int> cnt[maxn];
vector <int> G[maxn];
int vis[maxn];
int bfs1()
{
queue<int> q;
q.push(1);
vis[1] = 0;
while(!q.empty())
{
int t = q.front();
if(t =&#