标签:c++
1 17 2 7400 6 7401 7402 7403 7404 7405 7406 7401 6 7412 7402 7400 7406 7410 7411 7402 5 7412 7403 7400 7401 7411 7403 6 7413 7414 7404 7400 7402 7412 7404 5 7403 7414 7415 7405 7400 7405 6 7404 7415 7407 7408 7406 7400 7406 7 7400 7405 7407 7408 7409 7410 7401 7407 4 7408 7406 7405 7415 7408 4 7409 7406 7405 7407 7409 3 7410 7406 7408 7410 4 7411 7401 7406 7409 7411 5 7416 7412 7402 7401 7410 7412 6 7416 7411 7401 7402 7403 7413 7413 3 7412 7403 7414 7414 3 7413 7403 7404 7415 3 7404 7405 7407 7416 2 7411 7412 5 7409 7408 7407 7405 7415 6 7415 7404 7414 7413 7412 7416
4 7400 共有m个地区 和n条公交线路 求距离所有公交站最近的那块区域 bfs或spfa所有公交站 用一个数组记录所有公交站距离i最远的距离 i: 1~10000 最后在所有最远距离中找到最小的那个即是答案 代码:#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #define MAX 9999999 using namespace std; vector<int>q[10005]; //邻接表 int max_dis[10005]; //记录最远距离 int dis[10005]; int vis[10005]; int m,n; void spfa(int start) { queue<int>qq; int i,j,head; for(i=1; i<=10000; i++) { vis[i]=0; dis[i]=MAX; } if(max_dis[start]==-1) //距离自己为1 max_dis[start]=1; dis[start]=1; qq.push(start); while(!qq.empty()) { head=qq.front(); qq.pop(); vis[head]=0; int v; for(i=0; i<q[head].size(); i++) { v=q[head][i]; if(dis[v]>dis[head]+1) { dis[v]=dis[head]+1; if(max_dis[v]<dis[v]) //找最远距离 max_dis[v]=dis[v]; if(!vis[v]) { vis[v]=1; qq.push(v); } } } } return ; } int main() { int t,i,j; scanf("%d",&t); while(t--) { for(i=0;i<=10000;i++) { q[i].clear(); max_dis[i]=-1; } scanf("%d%d",&m,&n); int u,v,w=1,mm,nn; while(m--) { scanf("%d%d",&u,&nn); while(nn--) { scanf("%d",&v); q[u].push_back(v); } } while(n--) { scanf("%d",&nn); while(nn--) { scanf("%d",&mm); spfa(mm); } } int minn=MAX,x=1; for(i=1; i<=10000; i++) { if(max_dis[i]<minn&&max_dis[i]!=-1) { minn=max_dis[i]; x=i; } } cout<<minn<<' '<<x<<endl; } return 0; }
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/42833853