题意 : 就是给你一个图求他补图的最短路是多少。
思路: 首先他的点很多,但是边很少,我们不可能根据这个图去构建他的补图,因为点有20w不管怎样都不合适,
那我们就要换一个思路了,就是我们用两个set,第一个set维护一个当前点不能到达的所有点,第二个set表示的是当前点可以到达的所有点,那么我们每次看,如果当前点可以到达的点在第一个set里面我们就吧这个点抹去,把他加入到第二个set里面(点v在第一个set里面出现过就表明当前点u可以到达v,那么就把v抹去,放到第二个set里面),那么放在第一个set里的点肯定都是补图中的和当前边构成的边,那么我们让他+1 就好了,讲的不是很清楚,看代码吧
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <set>
#include <queue>
#define inf 0x7f7f7f
using namespace std;
const int maxn = 200010;
struct node
{
int nex,to;
}edg[maxn * 4];
int cnt = 0 ,head[maxn],dist[maxn],n,m;
set<int>aa;set<int>bb; //aa 可以从起点到达的点,bb不能到达的点
queue<int>que;
void init()
{
aa.clear(),bb.clear();