hdu 2377
12136 ワード
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2377
考え方:各点spfaに対して1回の最短ルートを求めて、毎回求める時すべて1つのMAX_を使いますdist[]は、現在のポイントから各ポイントへの最短パスの最大値を保存し、この配列のmin値がstar valueになります.の
View Code
考え方:各点spfaに対して1回の最短ルートを求めて、毎回求める時すべて1つのMAX_を使いますdist[]は、現在のポイントから各ポイントへの最短パスの最大値を保存し、この配列のmin値がstar valueになります.の
View Code
1 #include<iostream>
2 #include<queue>
3 #include<vector>
4 const int MAXN=10000+10;
5 const int inf=1<<30;
6 using namespace std;
7 struct Node{
8 int v,w;
9 };
10 vector<Node>mp[MAXN];
11 int dist[MAXN];
12 bool visited[MAXN];
13 int MAX_dist[MAXN];
14 int n,m;
15
16 void SPFA(int u){
17 for(int i=1;i<MAXN;i++)dist[i]=inf;
18 dist[u]=1;
19 if(MAX_dist[u]==-1)MAX_dist[u]=1;
20 memset(visited,false,sizeof(visited));
21 queue<int>Q;
22 Q.push(u);
23 while(!Q.empty()){
24 int u=Q.front();
25 Q.pop();
26 visited[u]=false;
27 for(int i=0;i<mp[u].size();i++){
28 int v=mp[u][i].v;
29 int w=mp[u][i].w;
30 if(dist[u]+w<dist[v]){
31 dist[v]=dist[u]+w;
32 if(dist[v]>MAX_dist[v])MAX_dist[v]=dist[v];
33 if(!visited[v]){
34 Q.push(v);
35 visited[v]=true;
36 }
37 }
38 }
39 }
40 }
41
42
43 int main(){
44 int _case;
45 scanf("%d",&_case);
46 while(_case--){
47 scanf("%d%d",&n,&m);
48 for(int i=1;i<MAXN;i++)mp[i].clear();
49 memset(MAX_dist,-1,sizeof(MAX_dist));
50 for(int i=1;i<=n;i++){
51 int u,v,k;
52 scanf("%d%d",&u,&k);
53 for(int j=1;j<=k;j++){
54 scanf("%d",&v);
55 Node p1,p2;
56 p1.v=u,p2.v=v;
57 p1.w=p2.w=1;
58 mp[u].push_back(p2);
59 mp[v].push_back(p1);
60 }
61 }
62 while(m--){
63 int u,k;
64 scanf("%d",&k);
65 for(int i=1;i<=k;i++){
66 scanf("%d",&u);
67 SPFA(u);
68 }
69 }
70 int MIN=inf,id=1;
71 for(int i=1;i<MAXN;i++){
72 if(MAX_dist[i]!=-1&&MAX_dist[i]<MIN){
73 MIN=MAX_dist[i];
74 id=i;
75 }
76 }
77 printf("%d %d
",MIN,id);
78 }
79 return 0;
80 }