给你m个管道 每个管道链接k个点 每两个点的距离都是1,因为数据太大,所以我们要找到代替 也就是再找一个是让其与之相连,本来两点距离为1后变为2;
数据太大用邻接表存 用vector会超时 相对而言 还是比较水的bfs 可惜比赛的时候根本没有看到 也就没有思考
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 1001009 int w[N],k,aa[N]; struct poiw { int f,v; }a[N<<1]; void add(int e,int f) { a[k].f=f; a[k].v=aa[e]; aa[e]=k++; } struct node { int x,t; }; int q(int s,int n) { memset(w,0,sizeof(w)); queue<node>Q; node q,p; q.x=s;q.t=0; Q.push(q); w[s]=1; if(n==1) return 1; while(Q.size()) { q=Q.front();Q.pop(); for(int i=aa[q.x];i!=-1;i=a[i].v) { p.x=a[i].f; p.t=q.t+1; if(!w[p.x]) { w[p.x]=1; Q.push(p); if(p.x==n) return p.t; } } } return -4; } int main() { int T,n,m,kk; scanf("%d",&T); while(T--) { k=0; memset(aa,-1,sizeof(aa)); scanf("%d%d%d",&n,&kk,&m); int e; for(int i=0;i<m;i++) { for(int j=0;j<kk;j++) { scanf("%d",&e); add(e,n+1+i); add(n+1+i,e); } } printf("%d ",q(1,n)/2+1); } return 0; }