题意不再赘述。。。

连接http://acm.hdu.edu.cn/showproblem.php?pid=4460

此题直接郁闷致死。。。。

比赛的时候用的是floyd然后直接超时。。。当时闪过spfa的想法,但是觉得如果是一个循环spfa话也会超时。。。

今天试了一下。。。果然超时= =。。。郁闷啊亲。。。然后优化了一下,用一个邻接表去存边。

一开始忽略了一点就是-1的输出。。。

代码。

View Code

  1 #include <stdio.h>
  2 #include <iostream>
  3 #define inf 10000
  4 #include <map>
  5 using namespace std;
  6
  7 map<string,int>str;//但是王林说用map,觉得无非就是搜两下,没那个必要。。。。过会试一下
  8 int n,ans;
  9 int dis[1005][1005];
 10 int q[1000005];
 11 struct node
 12 {
 13     int u[1005];
 14     int utop;
 15 }edge[1005];
 16 void init(int n)//边的初始化
 17 {
 18     int i,j;
 19     for(i = 0;i < n;i++)
 20     {
 21         for(j = i+1;j < n;j++)
 22         dis[j][i] = dis[i][j] = inf;
 23         dis[i][i] = 0;
 24     }
 25 }
 26 void spfa(int pre)
 27 {
 28     int i,vis[10005] = {0},f,r;
 29     int d[1005];
 30     f = r = 0;
 31     q[r++] = pre;
 32     vis[pre] = 1;
 33     for(i = 0;i < n;i++)//这步不能用dis赋值啊亲,我找了好久。。。发现那样的话第一次就没有入栈 的= =,一边循环直接跳出
 34     d[i] = inf;
 35     d[pre] = 0;
 36
 37     while(f<r)
 38     {
 39         int temp;
 40         temp = q[f++];
 41
 42         for(i = 0;i < edge[temp].utop;i++)
 43         {
 44             if(d[edge[temp].u[i]] > dis[temp][edge[temp].u[i]] + d[temp] && dis[temp][edge[temp].u[i]] + d[temp] <= 7)
 45             {
 46                 dis[pre][edge[temp].u[i]] = d[edge[temp].u[i]] = dis[temp][edge[temp].u[i]] + d[temp];
 47
 48                 if(!vis[edge[temp].u[i]])
 49                 {
 50                     q[r++] = edge[temp].u[i];
 51                     vis[edge[temp].u[i]] = 1;
 52                 }
 53             }
 54         }
 55     }
 56 }
 57 int main()
 58 {
 59     int i,j;
 60     string s,s1,s2;
 61     int m;
 62     while(scanf("%d",&n)&&n)
 63     {
 64         ans = -1;
 65         int hash[1005] = {0};
 66         str.clear();
 67         for(i = 0;i < n;i++)
 68         {
 69             cin>>s;
 70             str[s] = i;
 71         }
 72         init(n);
 73         scanf("%d",&m);
 74         while(m--)
 75         {
 76             cin>>s1>>s2;;
 77             int a,b;
 78             a = str[s1];
 79             b = str[s2];
 80             if(hash[a] == 0)//用一个hash 来看是否访问过,对邻接表进行初始化
 81             hash[a] = 1,edge[a].utop = 0;
 82             if(hash[b] == 0)
 83             hash[b] = 1,edge[b].utop = 0;
 84             edge[a].u[edge[a].utop++] = b;
 85             edge[b].u[edge[b].utop++] = a;
 86             dis[a][b] = dis[b][a] = 1;
 87         }
 88
 89         for(i = 0;i < n;i++)//遍历
 90         spfa(i);
 91         for(i = 0;i < n;i++)
 92         {
 93             for(j = i+1;j < n;j++)//减少时间
 94             if(ans < dis[i][j])
 95             ans = dis[i][j];
 96         }
 97         if(ans > 7)//如果有大于7的话说明有连接不上的。其实就是ans初值inf
 98         puts("-1");
 99         else
100         printf("%d\n",ans);
101     }
102 }

转载于:https://www.cnblogs.com/0803yijia/archive/2012/11/08/2761693.html

hdu 4460 friend chains spfa 最短路里面的最长路相关推荐

  1. ssl1762-工厂的烦恼【图论,最短路变形(最长路)】

    题目 一个有向图,求它的最长路. 输入 5 5 1 2 2 2 4 9 1 3 7 3 4 1 4 5 6 输出 17 解题思路 就是最短路的算法进行一些更改.不过注意加判断 if (a[i][k] ...

  2. 【图论】C059_AW_GF和猫咪的玩具 分糖果(floyd求最短路中的最长路 | 最后一个小朋友吃完的时间)

    一.GF和猫咪的玩具 GF同学和猫咪得到了一个特别的玩具,这个玩具由n个金属环(编号为1-n),和m条绳索组成,每条绳索连接两个不同的金属环,并且长度相同. GF左手拿起金属环L,猫咪右手(或者说:爪 ...

  3. HDU 4460 Friend Chains(map + spfa)

    Friend Chains Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  4. HDU 4562 守护雅典娜(DAG上的最长路)

    理解错题意了...写的很麻烦,而且900+卡过... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstr ...

  5. *【HDU - 6201】transaction transaction transaction(树形dp 或 spfa最长路 或 网络流)

    题干: 题目大意: 给出一棵n个顶点的树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品 ...

  6. P1807 最长路 (SPFA写法)

    题目描述 设 G 为有 n 个顶点的带权有向无环图,G 中各顶点的编号为 1 到 n,请设计算法,计算图 G 中 1,n 间的最长路径. 输入格式 输入的第一行有两个整数,分别代表图的点数 n 和边数 ...

  7. 【SPFA】最长路(洛谷)

    最长路 题目 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入 ...

  8. hdu 1224 最长路

    开始用dijkstra直接求,发现不行,算法问题(1-2,(30),2-4(20),1--3(10),3--4(100)最后一个点无法更新,导致错误),后用取负,加大数法也没过. 现在(寒假了):求负 ...

  9. POJ3160强连通+spfa最长路(不错)

    题意:       给你一个有向图,每个点上有一个权值,可正可负,然后给你一些链接关系,让你找到一个起点,从起点开始走,走过的边可以在走,但是拿过权值的点就不能再拿了,问最多能拿到多少权值? 思路: ...

最新文章

  1. 世界上最好的光刻机为什么来自荷兰?【物联网智商精选】
  2. cisco与h3c的console、vty配置比较
  3. java 大纲,Java学科学习大纲
  4. 极兔收购百世快递,谁是赢家?
  5. 设置最小值与最大值 css,一文学会使用 CSS 中的 min(), max(), clamp() 以及它们的使用场景...
  6. 重新封装一个iptables防止规则重复
  7. C语言和C++的区别
  8. python离线安装依赖包_python离线安装外部依赖包的实现
  9. scala写入mysql_Scala:读写文件
  10. 第十章--聚类分析 第5组 小组作业
  11. [宋史学习] 赵光义篡改历史
  12. 关于免费域名和空间搭建个人网站——服务器篇
  13. ubuntu20.04不能切换输入法
  14. 揭秘沃尔玛、腾讯、京东、浙商银行的供应链管理方案
  15. day4. jetson nx 确认 SPI 时钟
  16. Flask之解读app.py文件
  17. mysql表date类型长度_mysql中数据类型的长度解释
  18. 要求实现符号函数sign(x)。
  19. Numpy中reshape函数、reshape(1,-1)的含义(浅显易懂,源码实例)
  20. Android studio编译错误

热门文章

  1. 【LC3开源峰会网络技术系列之三】基于JStorm的网络分析平台 1
  2. 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建
  3. 《中国制造业走向2025》从构建新价值网络开始
  4. 使用OpenGL一年后
  5. bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined
  6. 计数排序,基数排序,桶排序
  7. 对象不支持“handleError”属性或方法 ajaxfileupload.js
  8. sqlserver创建存储过程、函数、
  9. .net通过获取客户端IP地址反查出用户的计算机名
  10. 前端差异化项目合并打包