~~~~
输入好长。。。
思路就是对线路上的每一个点BFS记录各个点到其所需的star值,然后ans记录所需的最大star值,最后输出ans最小的star值及相应的id。
开始建链接矩阵,结果MLE,于是修改了下。
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2377
http://acm.zju.edu.cn/onlinejudge/showProblemStatus.do?problemId=1912
~~~~
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<queue> #define N 10000 #define INF 0x7fffffff using namespace std; int nz,nr; int z[N]; //记录每一个zone周围的相连的zone的数目 int g[N][15]; //与其相连的zone的id int res[N]; //每一次bfs后距离起点所需的star值 int ans[N]; //纪律每一个区域所需的最大star值 int vis[N]; void bfs(int u) { queue<int> q; q.push(u); res[u]=1; while(!q.empty()) { u=q.front(); q.pop(); for(int i=0;i<z[u];i++) { if(!vis[g[u][i]]) { vis[g[u][i]]=1; int v=g[u][i]; res[v]=res[u]+1; q.push(v); } } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&nz,&nr); for(int i=0;i<nz;i++) { int m,id; scanf("%d%d",&id,&m); z[id]=m; for(int j=0;j<m;j++) { int t; scanf("%d",&t); g[id][j]=t; } } memset(res,0,sizeof(res)); memset(ans,0,sizeof(ans)); for(int i=0;i<nr;i++) { int m; scanf("%d",&m); for(int j=0;j<m;j++) { int s; scanf("%d",&s); memset(vis,0,sizeof(vis)); vis[s]=1; bfs(s); for(int k=0;k<10000;k++) ans[k]=max(ans[k],res[k]); } } int star=INF,center; for(int i=0;i<10000;i++) { if(ans[i] && ans[i]<star) { star=ans[i]; center=i; } } printf("%d %d\n",star,center); } return 0; }
HDU 2377 && ZOJ 2412
时间: 2024-11-05 06:30:21