hdu 2112 HDU Today

来源:互联网 发布:索隆 知乎 编辑:程序博客网 时间:2024/06/04 18:45

这道题目最多只有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;}

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

0 0
原创粉丝点击