题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5876
求补图的最短路,赛场上看到补图不知一时忘怎么回事了,因为数组开小了,RE一发。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <string>
#include <queue>
#include <set>
#include <list>
#include <iostream>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
using namespace std;
int T,p,q,n,m,k,t,r,y,x;
int bb[1000003],cc[1000004],dd[1000003];
struct node
{
int u;
int v;
} aa[1000002];
void ad(int v, int u)
{
aa[x].u = u;
aa[x].v = bb[v];
bb[v] = x++;
aa[x].u = v;
aa[x].v = bb[u];
bb[u] = x++;
}
void bfs(int a)
{
set<int> pp;
set<int >qq;
for(int i = 1; i <= n; i++)
if(i != a)
pp.insert(i);
queue<int>q1;
q1.push(a);
cc[a]=0;
while(!q1.empty())
{
int v =q1.front();
q1.pop();
for(int i= bb[v]; i!=-1; i=aa[i].v)
{
if(pp.find(aa[i].u) == pp.end())
continue;
pp.erase(aa[i].u);
qq.insert(aa[i].u);
}
set<int>::iterator p = pp.begin();
for(; p!=pp.end(); p++)
cc[*p]=cc[v]+1,q1.push(*p);
pp.swap(qq);
qq.clear();
}
}
int main()
{
scanf("%d", &T);
while(T--)
{
memset(bb,-1,sizeof bb);
memset(cc,-1,sizeof cc);
x=0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &p,&q);
ad(p,q);
}
scanf("%d", &r);
bfs(r);
k=0;
for(int i = 1; i <= n; i++)
if(cc[i] != 0)
{
if(k==0)
{
printf("%d", cc[i]);
k=1;
}
else
printf(" %d", cc[i]);
}
printf("\n");
}
return 0;
}