POJ 1125 Stockbroker Grapevine 最短路folyd算法
2015-11-29 16:50
399 查看
在明白folyd算法的前提下。。感觉这题题意比写法更难,题意:有n个人要散布谣言,每个人都可以定向的向若干个人传播谣言,同时需要花费若干时间,现在要让一个谣言能够传递到整个n个人的群体,问从哪个人开始这个谣言可以尽量快的传遍整个群体?传遍整个群体所用时间的定义是,从起始者开始传递,到整张图最后一个人接到谣言为止。
如果有的人永远无法被谣言传播到,则输出disjoint
翻译成图论的话就是,n个节点的带正权有向图,判断其是否为连通图,并寻找各节点作为源点时的各个节点间最短路的最大值的最小值。
这就是folyd算法了,先由input构建这张有向图,其次用folyd算法统计每个节点到所有节点的时间,即生成最短路。
再对于每个节点,考虑其到其他所有节点的最短时间,其中最大值就是从该节点出发到达整张图所需的时间(这个不难理解,对于源点u,如果到目的点v的最短路时间最长,说明这段时间内足以让谣言传给v和其他的人),那么这n个人的时间取最小值即为答案
poj的数据居然没有包括进整图不是连通图的情况,即“disjoint”的情况,这个。。我写的时候也忘写了,就迷迷糊糊的1A了...
如果有的人永远无法被谣言传播到,则输出disjoint
翻译成图论的话就是,n个节点的带正权有向图,判断其是否为连通图,并寻找各节点作为源点时的各个节点间最短路的最大值的最小值。
这就是folyd算法了,先由input构建这张有向图,其次用folyd算法统计每个节点到所有节点的时间,即生成最短路。
再对于每个节点,考虑其到其他所有节点的最短时间,其中最大值就是从该节点出发到达整张图所需的时间(这个不难理解,对于源点u,如果到目的点v的最短路时间最长,说明这段时间内足以让谣言传给v和其他的人),那么这n个人的时间取最小值即为答案
poj的数据居然没有包括进整图不是连通图的情况,即“disjoint”的情况,这个。。我写的时候也忘写了,就迷迷糊糊的1A了...
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <map> #include <string> #include <cstdlib> #include <vector> #include <cmath> //#define file using namespace std; #define MAX (1<<26) int n; int mp[110][110]; void init() { for(int i=0; i<110; i++) { for(int j=0; j<110; j++) { mp[i][j]=MAX; if(i==j)mp[i][j]=0; } } } void folyd() { //using the mind of folyd algorithm //for each path between node i and j //we update its length through the node k between i and j for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(mp[i][k]+mp[k][j]<mp[i][j]) { mp[i][j]=mp[i][k]+mp[k][j]; } } } } } int main() { while(cin>>n) { int e=0; init(); if(n==0)break; for(int i=1; i<=n; i++) { int num; cin>>num; int des,cost; while(num--) { cin>>des>>cost; mp[i][des]=cost; } } folyd(); int ans=0; int anst=MAX; for(int i=1; i<=n; i++) { int tmp=0; for(int j=1; j<=n; j++) { tmp=max(mp[i][j],tmp); //even when we can't match these two points we should add it //which stands for "unreachable" } if(tmp==MAX) { e++; } if(tmp<anst&&tmp!=-1&&tmp!=0) { anst=tmp; ans=i; } } if(e==n) cout<<"disjoint"<<endl; else cout<<ans<<" "<<anst<<endl; } }
相关文章推荐
- How to customize the console applicaton
- spring-OpenSessionInVies延长session的生命周期
- Linux内核list_head学习(二)
- php判断变量类型常用方法
- oj 1018 放苹果
- 安装eclipse for php
- [LeetCode] Sort Colors
- 1. Spring Security 4.2
- ASP_NET_MVC3_请求处理流程(1) MVC请求入口
- 【ios】AddChildViewController 实现 Pop View
- 数据结构 栈的应用任意进制转换(c语言实现)
- Go 语言Map(集合)
- Linux 内核list_head 学习(一)
- HDU-计算机学院大学生程序设计竞赛(2015’11)1004 质方数(打表)
- 树状数组模板程序
- zookeeper源码分析之五服务端(集群leader)处理请求流程
- 开发中的后++运算一个迷惑
- 读《不要等到毕业以后》后感
- LintCode-剑指Offer-(41)最大子数组
- ASP_NET_MVC3_请求处理流程(2) MVC源码分析