哈理工 oj 2122 旅行(map + 最短路dij算法)
旅行 | ||||||
|
||||||
Description | ||||||
“04.24,和Sakura去东京天空树,世界上最暖和的地方天空树的顶上。 ” “04.26。和Sakura去明治神宫。有人在那里举办婚礼。” “04.25。和Sakura去迪士尼。鬼屋非常可怕。可是有Sakura在,所以不可怕。 ” “Sakura最好了。” ——江南 《龙族》
绘梨衣和路明非今天要从迪士尼前往天空树,但他们的钱不多了,所以能省则省,他们如今有一个地图上面有n个景点和m条景点之间的路,每条路坐车都须要一定的钱数,如今他们求助于你,请你帮他们计算下从当前地点到目的地最少须要的钱数。 |
||||||
Input | ||||||
有多组数据,每组数据第一行有两个数字2<=n<=30000,1<=m<=30000。
接下来n行输入n个地名。 接下来m行每行有两个字符串(长度不超过20)和一个数字,代表两地之间的坐车的费用。 接下来一行输入两个字符串分别代表起点和终点。 |
||||||
Output | ||||||
一个int数代表最少须要的钱数。
数据保证不会超过int型范围。 |
||||||
Sample Input | ||||||
2 1 disney TokyoSkyTree disney TokyoSkyTree 1 disney TokyoSkyTree |
||||||
Sample Output | ||||||
1 | ||||||
Source | ||||||
2014暑假集训练习赛(7月19日) 看到 理工题目上 这个题目做的人没几个 。就看看是什么玩意儿~!~ #include<iostream> #include<sstream> #include<algorithm> #include<cstdio> #include<string.h> #include<cctype> #include<string> #include<cmath> #include<vector> #include<stack> #include<queue> #include<map> #include<set> using namespace std; const int maxn=30003; const int INF=0x1f1f1f1f; int n,m; //标记起始位置 string s; string e; map<string,int>cnt;//映射成节点编号 struct Edge { int from,to,dist; Edge(int u,int v,int d):from(u),to(v),dist(d) {} }; vector<Edge>edges;//存储边的结点信息 vector<int>G[maxn];//邻接表 bool done[maxn]; //标记是否訪问过 int d[maxn]; //距离数组 struct heapnode //用于优先队列自己定义 { int d,u; bool operator <(const heapnode rhs) const { return d > rhs.d; } heapnode(int dd,int uu):d(dd),u(uu) {} }; void init()//初始化不可缺少 { for(int i=0; i<n; i++) G[i].clear(); edges.clear(); } void addedge(int from,int to,int dist) { edges.push_back(Edge(from,to,dist)); int m = edges.size(); G[from].push_back(m-1); } void dij( int s) { priority_queue<heapnode>Q; for(int i=0; i<=n; i++)//初始化距离数组 d[i]=INF; d[s]=0; memset(done ,0,sizeof(done)); Q.push( heapnode(0,s) ); while(!Q.empty()) { heapnode x = Q.top(); Q.pop(); int u=x.u; if(u==cnt[e]) { printf("%d\n",x.d); break; } if(done[u])continue; done[u] = true; for(int i=0; i<G[u].size(); i++) { Edge& e=edges[G[u][i]];//取出来一条邻接边 if(d[e.to]>d[u]+e.dist) { d[e.to] = d[u] + e.dist; Q.push((heapnode(d[e.to],e.to))); } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int t=1; int ans=0; string str; init(); for(int i=0; i<n; i++) { cin>>str; cnt[str]=t++; } for(int i=0; i<m; i++) { string str2; int x; cin>>str>>str2>>x; addedge(cnt[str],cnt[str2],x); addedge(cnt[str2],cnt[str],x); } cin>>s>>e; dij(cnt[s]); s.clear(); e.clear(); cnt.clear(); } return 0; } /* 2 1 a v a v 1 a v 3 2 a b c a b 2 b c 3 a c */ |