2012杭州现场赛 H - Friend Chains dijkstra+邻接表
来源:互联网 发布:昆明关键字优化公司 编辑:程序博客网 时间:2024/05/16 17:24
题目出处:http://acm.hdu.edu.cn/showproblem.php?pid=4460
题意: 求任意两个点的最小值,再从求出的所有最小值中,选择一个最大的输出,若存在一个点无法到达另一个点,输出-1;
解法:直接暴力枚举出每两个点的距离。
这道题做了将近一天时间。。无奈不太懂 时间复杂度。
一般的dijkstra 应该需要两个for,即时间复杂度应该是o(n*n),再加上每个点都要进行一次(+一个for),所以时间复杂度应该是o(n*n*n).
就是 1e9 ,而1s 运行 1e8 。显然不行。
#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<map>#include<queue>#include<vector>using namespace std;const int N=1e3+10;int n,vis[N],ans,k;char aa[11],bb[11];string a,b;vector<int>road[N];map<string,int>m;queue<int>q;void init(){ans=-1;m.clear(); //清空上一轮 m(map),road[N](vector) 内的的数据;for(int i=0;i<N;++i)while(!road[i].empty())road[i].pop_back();}void input(){for(int i=0;i<n;++i){scanf("%s",&aa);m[a=aa]=i; //这样比直接“cin>>a”省时间}scanf("%d",&k);for(int i=0;i<k;++i){scanf("%s%s",&aa,&bb);road[m[a=aa]].push_back(m[b=bb]); //构建邻接表road[m[b]].push_back(m[a]);}}void dijsktra(){for(int i=0;i<n;++i){memset(vis,0,sizeof(vis));while(!q.empty())q.pop();int step[N]={0};vis[i]=1;q.push(i);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<road[x].size();++i) //邻接表进行dijkstra(压缩路径直接省略),也能算是bfs()吧;{if(!vis[road[x][i]]){q.push(road[x][i]);vis[road[x][i]]=1;step[road[x][i]]=step[x]+1;}}} for(int i=0;i<n;++i) //存在没有遍历的vis[i],即说明存在两个点不联通。if(!vis[i])return;for(int i=0;i<n;++i)ans=max(ans,step[i]);}}void print(){printf("%d\n",ans);}int main(){while(scanf("%d",&n)==1&&n){ init(); input(); dijsktra(); print(); }}
加上邻接表,就能优化很多时间复杂度是 o(n*m*n),如果图不会太稠密,那么m应该就会很小,所以就接近o(n*n)。
0 0
- 2012杭州现场赛 H - Friend Chains dijkstra+邻接表
- 顶点对间最短路: SPFA —— 2012.11.04 ACM 杭州 现场赛 H题:Friend Chains!
- 2012杭州赛区(浙江理工大学)H - Friend Chains
- HDU 4460 Friend Chains 第37届ACM杭州赛区 H题
- 2012杭州现场赛
- hdu 4777 2013ACM/ICPC杭州现场赛 H题 Rabbit Kingdom
- dijkstra邻接表
- hdu 4460 Friend Chains
- hdu 4460 Friend Chains
- hdu4460 Friend Chains
- HDU 4460 Friend Chains
- HDU 4460 Friend Chains
- Friend Chains(spfa)
- hdu-4460 Friend Chains
- HDU 4460 Friend Chains
- HDU4460 Friend Chains
- HDU 4460 Friend Chains
- NEFU 207 dijkstra邻接表
- codeforce C Plant
- poj 3625 Building Roads(最小生成树)
- codeforces 689D
- WeakReference与SoftReference
- JavaScript COOKIE 操作总结
- 2012杭州现场赛 H - Friend Chains dijkstra+邻接表
- 实习总结——sql语句的重要性
- xcode 制作静态库.a文件 详解
- R语言与机器学习学习笔记(分类算法)(2)决策树算法
- 改变tomcat的默认欢迎界面
- Android 对话框(Dialog)大全
- iOS--正则表达式的简单使用
- Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
- Unity DestroyImmediate和Destroy区别