hdu 2112 HDU Today

这道题目最多只有150个点。。
所以floyd可以跑

#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
int ways[200][200];
string start,fin;
map<string,int>way;
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==-1)
            break;
        way.clear();
        int cnt=1;
        cin>>start>>fin;
        int flag=0;
        way[start]=cnt;
        if(start!=fin)
        {
            cnt++;
            way[fin]=cnt;
        }
        else
        {
            flag=1;
        }
        start.clear();
        fin.clear();
        int num1,num2;
        int much;
        memset(ways,0x3f3f3f3f,sizeof(ways));
        for(int i=0;i<n;i++)
        {
            cin>>start>>fin;
            if(!way[start])
            {
                cnt++;
                way[start]=cnt;
                num1=cnt;
            }
            else
            {
                num1=way[start];
            }
            if(!way[fin])
            {
                cnt++;
                way[fin]=cnt;
                num2=cnt;
            }
            else
            {
                num2=way[fin];
            }
            cin>>much;
            ways[num1][num2]=much;
            ways[num2][num1]=much;
        }
        for(int k=1;k<=cnt;k++)
        {
            for(int i=1;i<=cnt;i++)
            {
                for(int j=1;j<=cnt;j++)
                {
                    ways[i][j]=min(ways[i][j],ways[i][k]+ways[k][j]);
                }
            }
        }
        if(flag)
        {
            cout<<'0'<<endl;
        }
        else if(ways[1][2]==0x3f3f3f3f)
        {
            cout<<"-1"<<endl;
        }
        else
        {
            cout<<ways[1][2]<<endl;
        }
    }
    return 0;
}

当然,标准的做法是djstl

#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int cnt;
string start,fin;
map<string,int>way;
struct sb
{
    int x;
    int t;
    sb(int a,int b)
    {
        x=a;
        t=b;
    }
    bool operator<(const sb&wakaka)const
    {
        return t>wakaka.t;
    }
};
vector<sb>ways[160];
int ts[160];
bool city[160];
void djstl(int who)
{
    for(int i=1;i<=cnt;i++)
    {
        ts[i]=0x3f3f3f3f;
        city[i]=false;
    }
    ts[who]=0;
    priority_queue<sb>q;
    q.push(sb(who,ts[who]));
    while(!q.empty())
    {
        sb x=q.top();
        q.pop();
        if(city[x.x])
        {
            continue;
        }
        city[x.x]=true;
        for(int i=0;i<ways[x.x].size();i++)
        {
            sb y=ways[x.x][i];
            if(ts[y.x]>x.t+y.t)
            {
                ts[y.x]=x.t+y.t;
                q.push(sb(y.x,ts[y.x]));
            }
        }
    }
}
int main()
{
    int n;
    while(cin>>n&&n!=-1)
    {
        cnt=1;
        int flag=0;
        way.clear();
        cin>>start>>fin;
        way[start]=cnt;
        if(start==fin)
        {
            flag=1;
        }
        else
        {
            cnt++;
            way[fin]=cnt;
        }
        int num1,num2,t;
        while(n--)
        {
            cin>>start>>fin;
            if(!way[start])
            {
                cnt++;
                way[start]=cnt;
                num1=cnt;
            }
            else
            {
                num1=way[start];
            }
            if(!way[fin])
            {
                cnt++;
                way[fin]=cnt;
                num2=cnt;
            }
            else
            {
                num2=way[fin];
            }
            cin>>t;
            ways[num1].push_back(sb(num2,t));
            ways[num2].push_back(sb(num1,t));
        }
        djstl(1);
        if(flag)
        {
            cout<<'0'<<endl;
        }
        else if(ts[2]==0x3f3f3f3f)
        {
            cout<<"-1"<<endl;
        }
        else
        {
            cout<<ts[2]<<endl;
        }
        for(int i=0;i<=cnt;i++)
        {
            ways[i].clear();
        }
    }
    return 0;
}

我这里优先队列优化了一下。。
两种时间差不多也是醉。。。

你可能感兴趣的:(HDU,floyd,djstl)