hdu2112 HDU Today 基础最短路

  这题的关键是把车站的名字转化为点的编号。我用的是map。声明一个map<string,int> st,然后按照字符串出现的次序给st赋值。例如:st[s1]=2;代表这字符串s1出现的次序是2。出现过的已经被标记。不会重复。接下来用模版就好。不过有一点要注意的是当起点和终点一样是,要输出0。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

//在主函数中Map初始化为INF
const int N = 160, INF =0x3f3f3f3f;
int dist[N], Map[N][N], pre[N];
//dist表示i到s的最短距离,Map记录图,pre记录前驱
bool p[N];//标记点是否已经被选择
void Dijkstra(int n,int s)
{
    int i,j,k, MIN;
    for(i=1; i<=n; i++) //初始化
    {
        p[i]=0;
        if(i!=s)
        {
            dist[i]= Map[s][i];
            pre[i]=s;
        }
    }
    dist[s]=0;
    p[s]=1;
    for(i=1; i<n; i++) //循环n-1次
    {
        MIN=INF;
        k=0;
        for(j=1; j<=n; j++)
        {
            if(!p[j]&&dist[j]<MIN)
            {
                MIN= dist[j];
                k=j;
            }
        }
        if(!k) return ;//没有点可以扩展
        p[k]=1; //将k从Vb中除去,加入Va
        for(j=1; j<=n; j++)
        {
            if(!p[j]&&Map[k][j]!=INF&&dist[j]>dist[k]+Map[k][j])
            {
                dist[j]= dist[k] + Map[k][j];
                pre[j]=k;
            }
        }
    }
}
void init()
{
    for(int i=0;i<=N;i++)
        for(int j=0;j<=N;j++)
            Map[i][j]=INF;
}
map<string,int> st;
int main()
{
    //freopen("test.txt","r",stdin);
    int n,i,j,k;
    char s1[35],s2[35];
    while(scanf("%d",&n)!=EOF)
    {
        if(n==-1) break;
        scanf("%s%s",s1,s2);
        if(strcmp(s1,s2)==0) {
            for(i=0;i<n;i++)
                scanf("%s%s%d",s1,s2,&k);
            printf("0\n");
            continue;
        }
        init();
        st.clear();
        st[s1]=1; st[s2]=2;
        j=2;
        for(i=0;i<n;i++)
        {
            scanf("%s%s%d",s1,s2,&k);
            if(st[s1]==0) st[s1]=++j;
            if(st[s2]==0) st[s2]=++j;
            if(st[s1]==st[s2]) continue;
            Map[st[s2]][st[s1]]=Map[st[s1]][st[s2]]=min(k,Map[st[s1]][st[s2]]);
        }
        Dijkstra(j,1);
        if(dist[2]<INF)
            printf("%d\n",dist[2]);
        else printf("-1\n");

    }
    return 0;
}
时间: 2024-10-15 22:38:44

hdu2112 HDU Today 基础最短路的相关文章

hdu2112(HDU Today 简单最短路)

Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了.这样住了一段时间,徐总对当地的交通还是不太了解.有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格).徐总经常会问蹩脚的英文问路:“Can

Hdu-2112 HDU Today (单源多点最短路——Dijsktra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给你N个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离.(起点终点相同距离为0)不能到达输出-1. 说真的开始看到这个题,我想利用数字标记那些地名,再利用dijsktra算法,但不知道如何用代码实现,后来在网上看博客 才知道有这样一个头文件#include<map>,map 映射,可以有这种效果,那么这题也就so easy!了, 我的AC代码 #include&l

HDU 2544:最短路( 最短路径入门 &amp;&amp;Dijkstra &amp;&amp; floyd )

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 30972    Accepted Submission(s): 13345 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

基础最短路2

基础最短路 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.  每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0

hdu 2112 HDU Today (最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的时候,这里注意不能直接输出0,必须用标记,因为数据可能还没有处理完!!!此处贡献n次wa. (2)这里是某大神教我的用map进行转换,将字符串转换成数字,值得参考.map<string,int>M,V:不过这里同样是wa了好多次.要注意的是将最先输入的开始和结束的点也要放到这个map里面. (3)

hdu 4568 Hunter 最短路+dp

Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2014    Accepted Submission(s): 615 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. Jame

hdu oj 2544 最短路(最短路径)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31874    Accepted Submission(s): 13798 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

基础最短路

基础最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3

hdu 4568 spfa 最短路算法+旅行商问题

http://acm.hdu.edu.cn/showproblem.php?pid=4568 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could. The area can be represented a