hdu 2112 Today(最短路 dijkstra+map容器的用法)and 1217(floyd+map)
2014-03-26 11:19
363 查看
2112:
题意是给你几个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离。(起点终点相同距离为0)不能到达输出-1。
这题学习了c++中map+string的用法。
C++ STL map:
1.简介:Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作。
2.map基本构造函数:
3.初始化数据方法:
4.基本操作函数
所以这道题用map+string+dijkstra就k.o啦~
dijkstra做法代码:
当然因为数据量较小,150,这题也可以用floyd+map+string,更好理解,但时间消耗比较大。
floyd做法代码:
1217:
题意是给你几个币种,然后给你汇率,让你计算几个币种兑换后,能不能盈利!(即大于1)
最短路的变种,用最短路的思路,求最大路就行了。
代码:
题意是给你几个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离。(起点终点相同距离为0)不能到达输出-1。
这题学习了c++中map+string的用法。
C++ STL map:
1.简介:Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作。
2.map基本构造函数:
#include<map> #include<string> using namespace std; map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map<char ,string>mapchar; map<char ,int>mapchar; map<int ,char >mapint;
3.初始化数据方法:
map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3. maplive[112]="April";//map中最简单最常用的插入添加!
4.基本操作函数
C++ Maps是一种关联式容器,包含“关键字/值”对 begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 equal_range() 返回特殊条目的迭代器对 erase() 删除一个元素 find() 查找一个元素 get_allocator() 返回map的配置器 insert() 插入元素 key_comp() 返回比较元素key的函数 lower_bound() 返回键值>=给定元素的第一个位置 max_size() 返回可以容纳的最大元素个数 rbegin() 返回一个指向map尾部的逆向迭代器 rend() 返回一个指向map头部的逆向迭代器 size() 返回map中元素的个数 swap() 交换两个map upper_bound() 返回键值>给定元素的第一个位置 value_comp() 返回比较元素value的函数
所以这道题用map+string+dijkstra就k.o啦~
dijkstra做法代码:
#include<stdio.h> #include<map> #include<string.h> #include<string> using namespace std; const int MaxN=155; const int INF=1 << 29; int mp[MaxN][MaxN], time[MaxN]; bool vis[MaxN]; void dijkstra(int star, int end) { memset(vis,0,sizeof(vis)); for(int i=star; i<=end; i++) time[i]=INF; time[star]=0; for(int i=star; i<=end; i++) { int mark=-1, mintime=INF; for(int j=star; j<=end; j++) if(!vis[j] && mintime > time[j]) { mintime=time[j]; mark=j; } vis[mark]=1; if(mintime==INF) break; for(int j=star; j<=end; j++) if(time[j] > time[mark]+mp[mark][j]) time[j] = time[mark]+mp[mark][j]; } } int main() { int num, k, tmptime; bool flag; char star[31], end[31]; map<string,int> station; while(scanf("%d",&num)!=EOF && num!=-1) { station.clear(); for(int i=0; i<MaxN; i++) for(int j=0; j<MaxN; j++) mp[i][j]=INF; flag=0; scanf("%s%s",star,end); if(strcmp(star,end)==0)//!若直接printf("0\n");可能报错,可能是因为数据没输完。 flag=1; station[star]=1; station[end]=2; k=3; for(int i=0; i<num; i++) { scanf("%s%s%d",star,end,&tmptime); if(!station[star])//!station 判断[star]是否存在 station[star]=k++; if(!station[end]) station[end]=k++; if(tmptime < mp[station[star]][station[end]]) mp[station[star]][station[end]]=mp[station[end]][station[star]]=tmptime; } if(flag) { printf("0\n"); continue; } dijkstra(1, k); if(time[2]==INF) printf("-1\n"); else printf("%d\n",time[2]); } return 0; }
当然因为数据量较小,150,这题也可以用floyd+map+string,更好理解,但时间消耗比较大。
floyd做法代码:
#include<stdio.h> #include<map> #include<string.h> #include<string> using namespace std; const int MaxN=155; const int INF=1 << 29; int mp[MaxN][MaxN]; void floyd(int end) { for(int k=1; k<end; k++) for(int i=1; i<end; i++) for(int j=1; j<end; j++) { if(mp[i][j] > mp[i][k]+mp[k][j]) mp[i][j] = mp[i][k]+mp[k][j]; } } int main() { int num; char star[31],end[31]; bool flag; int tmptime,k; map<string,int> station; while(~scanf("%d",&num),num!=-1) { station.clear(); flag=0; for(int i=1; i<MaxN; i++) for(int j=1; j<MaxN; j++) { if(i==j) mp[i][j]==0; else mp[i][j]=INF; } flag=0; scanf("%s%s",star,end); if(strcmp(star,end)==0) flag=1; station[star]=1; station[end]=2; k=3; for(int i=0; i<num; i++) { scanf("%s%s%d",star,end,&tmptime); if(!station[star]) station[star]=k++; if(!station[end]) station[end]=k++; if(tmptime < mp[station[star]][station[end]]) mp[station[star]][station[end]]=mp[station[end]][station[star]]=tmptime; } if(flag) { printf("0\n"); continue; } floyd(k); if(mp[1][2]==INF) printf("-1\n"); else printf("%d\n",mp[1][2]); } return 0; }
1217:
题意是给你几个币种,然后给你汇率,让你计算几个币种兑换后,能不能盈利!(即大于1)
最短路的变种,用最短路的思路,求最大路就行了。
代码:
#include<stdio.h> #include<iostream> #include<map> #include<string> using namespace std; map<string,int>name; #define MAXN 35 double g[MAXN][MAXN]; int n; void floyed()//节点从1~n编号 { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(g[i][j]<g[i][k]*g[k][j]) g[i][j]=g[i][k]*g[k][j]; } int main() { int i,m,j; string str1,str2; double r; int iCase=0; while(scanf("%d",&n),n) { iCase++; for(i=1;i<=n;i++) { cin>>str1; name[str1]=i; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j)g[i][j]=1; else g[i][j]=0; } scanf("%d",&m); while(m--) { cin>>str1>>r>>str2; g[name[str1]][name[str2]]=r; } floyed(); bool flag=false; for(i=1;i<=n;i++) if(g[i][i]>1) {flag=true;break;} if(flag) printf("Case %d: Yes\n",iCase); else printf("Case %d: No\n",iCase); } return 0; }
相关文章推荐
- hdu 1217 Arbitrage 最短路 floyd+map容器
- hdu 2112 HDU Today(dijkstra && 字符串建图 && floyd加map)
- hdu 2112 Today【F - map + Floyd - 入门训练】
- hdu 2112 Today【F - map + Floyd - 入门训练】
- 【hdu 2112】 HDU Today ( 最短路 Dijkstra)(map)
- HDU 2112 HDU Today【最短路+map容器,spfa算法+Dijkstra算法】
- HDU 2112 Today(Dijkstra+map)
- 文章标题 HDU 1217 : Arbitrage(最短路--Floyd+map)
- hdu 2112 floyd+map容器
- hdu 1217 floyd+map容器
- HDU 2112:HDU Today【Dijkstra & SPFA & Floyd】
- hdu 2112 HDU Today 最短路spfa+容器map
- HDU 2112 HDU Today (map+dijkstra)
- HDU 2112 HDU Today (最短路(dijkstra邻接矩阵) + hash + 二分)
- HDU_2112 HDU Today(DIjkstra + map映射)
- hdu-2112-HDU Today(dijkstra + map)
- HDU-#2112 HDU Today(Dijkstra+map)
- hdu 1217 map+floyd
- hdu 2112 HDU Today(map与dijkstra的结合使用)
- hdu 2112最短路的dijkstra实现