HDU 5876 Sparse Graph
广搜。
因为路径的长度均为$1$,所以每个节点只会被更新一次。
思路:对于一个还未确定路径长度的点$i$,如果他除了与他直接相邻的点之外有别的点已经确定了最短路,那么这个点现在也可以确定最短路了。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-6; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c=getchar(); x=0; while(!isdigit(c)) c=getchar(); while(isdigit(c)) {x=x*10+c-'0'; c=getchar();} } const int maxn=200010; int T,n,m,d[maxn],sz,h[maxn],s; struct Edge{int u,v,nx;}e[maxn]; void add(int u,int v) { e[sz].u=u; e[sz].v=v; e[sz].nx=h[u]; h[u]=sz++; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(d,-1,sizeof d); memset(h,-1,sizeof h); sz=0; for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } scanf("%d",&s); d[s]=0; sz=1; int dis=0; while(1) { int sum=0; dis++; for(int i=1;i<=n;i++) { if(d[i]!=-1) continue; int g=0; for(int j=h[i];j!=-1;j=e[j].nx) if(d[e[j].v]!=-1&&d[e[j].v]<dis) g++; if(sz==g) continue; d[i]=dis; sum++; } if(sum==0) break; sz=sz+sum; if(sz==n) break; } sz=0; for(int i=1;i<=n;i++) { if(i==s) continue; sz++; printf("%d",d[i]); if(sz<n-1) printf(" "); else printf("\n"); } } return 0; }