• HDU 4460 Friend Chains(2012年杭州赛区现场赛H题)


    题意:一个有n个点,m条边的无向图,找出最短路中的两个点的路径最大值。

    n次spfa求最短路,然后找出最大值即可,踩着时间线险过。。。

    代码:

      1 #include <iostream>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <cstdio>
      5 #include <queue>
      6 #include <string>
      7 #include <map>
      8 using namespace std;
      9 
     10 const int oo=1<<30;
     11 const int maxn=1001;
     12 const int maxm=20001;
     13 int n,m,num;
     14 int cnt;
     15 int dis[maxn],head[maxn];
     16 bool vis[maxn];
     17 queue<int>qu;
     18 map<string, int> mp;
     19 struct node{
     20     int u;
     21     int v;
     22     int w;
     23     int next;
     24 }edge[maxm];
     25 
     26 void add(int u, int v, int w){
     27     edge[cnt].u=u;
     28     edge[cnt].v=v;
     29     edge[cnt].w=w;
     30     edge[cnt].next=head[u];
     31     head[u]=cnt++;
     32     edge[cnt].u=v;
     33     edge[cnt].v=u;
     34     edge[cnt].w=w;
     35     edge[cnt].next=head[v];
     36     head[v]=cnt++;
     37 }
     38 
     39 void spfa(int s){
     40     for(int i=0; i<n; i++){
     41         dis[i]=oo;
     42         vis[i]=false;
     43     }
     44     dis[s]=0;
     45     qu.push(s);
     46     vis[s]=true;
     47     while(!qu.empty()){
     48         int u=qu.front();
     49         qu.pop();
     50         vis[u]=false;
     51         for(int i=head[u];i!=-1;i=edge[i].next){
     52             int v=edge[i].v;
     53             if(dis[u]+edge[i].w<dis[v]){
     54                 dis[v]=dis[u]+edge[i].w;
     55                 if(!vis[v]){
     56                     vis[v]=true;
     57                     qu.push(v);
     58                 }
     59             }
     60         }
     61     }
     62 }
     63 
     64 void init(){
     65     while(!qu.empty()){
     66         qu.pop();
     67     }
     68     cnt=0;
     69     num=0;
     70     mp.clear();
     71     memset(head, -1, sizeof(head));
     72 }
     73 
     74 int main(){
     75     string str;
     76     string str1;
     77     while(~scanf("%d",&n)){
     78         init();
     79         if(n==0)
     80             break;
     81         for(int i=0; i<n; i++){
     82             cin>>str;
     83             mp[str]=i;
     84         }
     85         scanf("%d",&m);
     86         for(int i=0; i<m; i++){
     87             cin>>str>>str1;
     88             int u=mp[str];
     89             int v=mp[str1];
     90             add(u, v, 1);
     91         }
     92         for(int i=0; i<n; i++){
     93             spfa(i);
     94             for(int j=0; j<n; j++){
     95                 num=max(num,dis[j]);
     96             }
     97         }
     98         num=num==oo?-1:num;
     99         printf("%d\n",num);
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    骑士飞行棋 C#代码详解
    C#中的static静态变量的用法
    Break和Continue的一些注意事项
    枚举类型
    html 01-认识Web和Web标准
    css 17-CSS3的常见边框汇总
    css 16-浏览器的兼容性问题
    css 15-Sass入门
    css 14-CSS3属性详解:Web字体
    css 13-CSS3属性:Flex布局图文详解
  • 原文地址:https://www.cnblogs.com/pony1993/p/2762289.html
Copyright © 2020-2023  润新知