hdu 2377

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2377

思路:对每个点spfa求一次最短路,每次求的时候都要用一个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\n",MIN,id);
78     }
79     return 0;
80 }
原文地址:https://www.cnblogs.com/wally/p/3020835.html