求调floyed

学术版

Dream__Sky @ 2023-03-28 20:48:51

题目

现在的大学都非常大。中山大学有四个校区,分别是广州北校区、广州南校区、广州东校区和珠海校。每个校区里面又包含了很多建筑物。有时,老师和学生经常要从某个校区或校区之间的某个建筑物到另外一个建筑物,他们想让你帮忙,计算出它们之间的最短路。

输入中包括 C 组测试数据。(1<=c<=15)

对于每组测试数据,第一行为一个整数 N(0<N≤100),表示路的条数。接下来的 N 行,第 i 行(1≤i≤N)包括两个字符串 Si,Ti 和一个整数 Di(0≤Di≤100)。表示 Si 到 Ti 有一条长为 Di 的路。

最后一行包含两个字符串 S 和 T,要我们求 S 到 T 的最短路径。Si,Ti,S,T 的格式都为:Campus.Place(某个校区的某个建筑物)。Campus 用:“North”,“South”,“East”,“Zhuhai”,表示,代表四个校区的名称,Place 为小于一百个字符的小写字母串,用 a-z中的字母表示。

输出共 C 行,每行对应一组测试数据。对于每组数据,如果 S 到 T 有路,输出最短路,否则输出-1。

输入数据

1

2

South.xiaolitang South.xiongdelong 2

South.xiongdelong Zhuhai.liyuan 100

South.xiongdelong South.xiaolitang

输出数据

2

代码

#include <bits/stdc++.h>
using namespace std;
int n,T,t;
map<string ,int > mp;
int a[501][501];
int dis[501][501];
int main()
{
    cin>>T;
    cin>>n;
    for(int i=1;i<=500;i++)
        for(int j=1;j<=500;j++) dis[i][j]=1e9;

    for(int i=1;i<=500;i++) dis[i][i]=0;

    string x,y;
    int z;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y>>z;
        if(!mp[x]) mp[x]=++t;
        if(!mp[y]) mp[y]=++t;
        dis[mp[x]][mp[y]]=dis[mp[y]][mp[x]]=min(z,dis[mp[x]][mp[y]]);
    }

    for(int k=1;k<=t;k++)
        for(int i=1;i<=t;i++)
            for(int j=1;j<=t;j++)
                if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];

    while(T--)
    {
        cin>>x>>y;
        if(dis[mp[x]][mp[y]]==1e9) cout<<-1<<endl;
        else cout<<dis[mp[x]][mp[y]]<<endl;
    }
    return 0;
}

|