hdu 2112 最短路 dijkstra优先队列

来源:互联网 发布:c 多线程编程 视频 编辑:程序博客网 时间:2024/05/19 03:16

http://acm.hdu.edu.cn/showproblem.php?pid=2112

还算蛮裸的,就是需要运用一下map,将字符串映射成一个int,对于map的运用还不够熟悉。。。

Map如果要查找一个元素是否出现在这个map之中的话就可以运用.count(),看他出现的次数,如果是0,肯定就没有出现过。还有一个就是要注意,每一个kase都需要重置这个map,运用.clear()。

这道题的图是无向图,因为公交的起点和终点可以互换的。。。没有考虑,一开始只写了单向。。

dijkstra优先队列 代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <map>#include <vector>using namespace std;#define M 10009#define INF 0x3f3f3f3ftypedef pair<int,int> P;struct edge{    int to,w;};int dis[M];int n;vector<edge> g[M];map <string,int> mp;void dij(int u){    fill(dis,dis+n,INF);    priority_queue <P, vector <P> , greater <P> > q; //优先队列    dis[u] = 0;    q.push(P(dis[u],u));    while(!q.empty())    {        P p = q.top();        q.pop();        int v = p.second;        if(dis[v] < p.first) continue;        for(int i = 0;i < g[v].size();i++) //记得是遍历 v所相邻的边。。一开始写成了u..        {            edge e = g[v][i];            if(dis[e.to] > dis[v]+e.w)            {                dis[e.to] = dis[v]+e.w;                q.push(P(dis[e.to],e.to));            }        }    }}int main(){    while(scanf("%d",&n)==1 && n!=-1)    {        for(int i = 0;i < n;i++)            g[i].clear();  //清空vector        mp.clear();//清除map中的所有元素。        int k = 0;        char s[50],e[50];        scanf("%s %s",s,e);        if(!mp.count(s)) //判断这个字符串是否出现在map中过            mp[s] = k++;        if(!mp.count(e))            mp[e] = k++; //终点所对应的编号        for(int i = 0;i < n;i++)        {            char a[50],b[50];            int temp;            scanf("%s %s %d",a,b,&temp);            if(!mp.count(a))            mp[a] = k++;            if(!mp.count(b))            mp[b] = k++;            edge e ;            e.to = mp[b];e.w = temp;            g[mp[a]].push_back(e);            e.to = mp[a];   //无向图。。WA一次,,对于车来说起点站和终点站是可以互换的。            g[mp[b]].push_back(e);        }        dij(0);        if(dis[mp[e]]!=INF)        printf("%d\n",dis[mp[e]]);        else            printf("-1\n",dis[mp[e]]);    }    return 0;}


0 0
原创粉丝点击