HDU 2112

来源:互联网 发布:chart.js 提示文字 编辑:程序博客网 时间:2024/06/13 11:24

最短路问题,我用的是dijkstra算法,网上说很水,可是我还是费了老鼻子劲才写出来。http://acm.hdu.edu.cn/showproblem.php?pid=2112

题意:说的是如何用最短时间到达目的地。如果到不了就输出-1.

 思路:大家都知道dijkstar算法求最短路且权值为正,但是这个题在于要把字符串给转换成一种可以用上最短路算法的形式,网上还有一种用STL的解法,如果有兴趣可以看下。我的主要办法是将字符串赋予一个标记来表示,这样问题就迎刃而解了。

#include <iostream>
#include <cstring>
#define maxn 155
using namespace std;
int m;
int vis[maxn];
int dis[maxn];
char ad[maxn][40];
int map[maxn][maxn];
int bian(char *s)//没办法还是用了指针
{
    int i;
    for(i=0;i<m;i++)
    {
        if(strcmp(ad[i],s)==0)return i;//如果有就将编号返回去
    }
    if(i==m)//如果没出现就添加进去
    {
        strcpy(ad[m],s);
        m++;
        return m-1;
    }
}
void dijkstra()//算法基本套路
{
    int i,j,next,mindist;
    memset(vis,0,sizeof(vis));
    for(i=0;i<m;i++)
    {
        dis[i]=map[0][i];//从0开始进行选择
    }
    vis[0]=1;//0不用访问
    for(i=0;i<m;i++)
    {
        mindist=9999;//赋值之后方便求最小的
        for(j=0;j<m;j++)
        {
            if(!vis[j]&&mindist>dis[j])
            {
                next=j;
                mindist=dis[j];
            }
        }
        if(mindist==9999)break;
        vis[next]=1;
        for(j=0;j<m;j++)
        {
            if(!vis[j]&&dis[next]+map[next][j]<dis[j])
            {
                dis[j]=dis[next]+map[next][j];
            }
        }
    }
    if(dis[1]==9999)
    {
        cout<<"-1"<<endl;
    }
    else
    {
        cout<<dis[1]<<endl;
    }
}
int main()
{
    int n;
    int x,y;
    int fenzhong;
    char st[40],en[40];
    char in[40],out[40];
    while(cin>>n&&n!=-1)
    {
        m=2;
        for(int i = 0 ;i < maxn ;i++)
        {
            for(int j = 0 ;j < maxn ;j++)
            {
                if(i==j)map[i][j]=0;
                else map[i][j]=9999;
            }
        }
        cin>>st>>en;
        strcpy(ad[0],st);
        strcpy(ad[1],en);
        for(int i = 0 ; i < n ;i++)
        {
            cin>>in>>out>>fenzhong;
            x=bian(in);//将字符串换成我们熟悉的下标
            y=bian(out);
            map[x][y]=map[y][x]=fenzhong;//赋值
        }
        if(strcmp(st,en)==0)//如果目的地和起点一样那就直接输出
        {
            cout<<"0"<<endl;
        }
        else
        {
            dijkstra();
        }
    }
    return 0;
}

0 0
原创粉丝点击