文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>2010 ACM-ICPC Multi-University Training Contest (7) - Host by HIT B Flight

2010 ACM-ICPC Multi-University Training Contest (7) - Host by HIT B Flight

时间:2010-08-20  来源:luyi0619

nlgn的最短路,需要讨论是否使用打折票。

Runid Proid Subtime Judgestatus Runtime Memory Language Code Length Author
505746 2945 2010-08-20 17:03:30 Accepted 5.99 s 41544 K C++ 2780 B luyi0619
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<functional>
#include<climits>
using namespace std;
map<string,int> mp;
char str1[100],str2[100];
bool flag[100001][2];
int len,inx,k1,k2,src,dst;
struct CITY
{
    int v,w;
        long long dis;
    bool flag;
    bool operator < (const CITY c) const
    {
        return dis>c.dis;
    }
};
CITY city,tmp;
vector<CITY> ivec[100001];
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)==2)
    {
        bool ok=false;
        memset(flag,0,sizeof(flag));
        mp.clear();
        for(int i=0; i<=n; i++)
            ivec[i].clear();
        inx=0;
        for(int i=0; i<m; i++)
        {
            scanf("%s %s %d",str1,str2,&len);
            if(mp.find(str1)==mp.end())
                mp[str1]=++inx;
            if(mp.find(str2)==mp.end())
                mp[str2]=++inx;
            k1=mp[str1];
            k2=mp[str2];
            city.v=k2;
            city.w=len;
            city.dis=0;
            city.flag=0;
            ivec[k1].push_back(city);
        }
        scanf("%s %s",str1,str2);
        if(mp.find(str1)==mp.end() || mp.find(str2)==mp.end())
        {
            printf("-1\n");
            continue;
        }
        src=mp[str1];
        dst=mp[str2];
        priority_queue<CITY> q;
        city.v=src;
        city.w=0;
        city.flag=0;
        city.dis=0;
        q.push(city);
        while(!q.empty())
        {
            city=q.top();
            q.pop();
            if(flag[city.v][city.flag])
                continue;
            flag[city.v][city.flag]=true;
            if(city.v==dst)
            {
                ok=true;
                break;
            }
            for(int i=0; i<ivec[city.v].size(); i++)
            {
                if(!city.flag)
                {
                    tmp.flag=1;
                    tmp.dis=city.dis+ivec[city.v][i].w/2;
                    tmp.v=ivec[city.v][i].v;
                    tmp.w=ivec[city.v][i].w;
                                        q.push(tmp);
                                        tmp.flag=0;
                    tmp.dis=city.dis+ivec[city.v][i].w;
                    tmp.v=ivec[city.v][i].v;
                    tmp.w=ivec[city.v][i].w;
                                        q.push(tmp);
                }
                                else
                                {
                                        tmp.flag=1;
                                        tmp.dis=city.dis+ivec[city.v][i].w;
                                        tmp.v=ivec[city.v][i].v;
                                        tmp.w=ivec[city.v][i].w;
                                        q.push(tmp);
                                }
            }
        }
        printf("%lld\n",ok==1?city.dis:-1);
    }
    return 0;
}
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载