EOJ1028 最短路

题目:EOJ1028

路由器是网络中用来转发IP报文的一种设备。



当路由器收到一个终端或者其它路由器发过来的报文时,它必须选项择最快的一条通信线路通向报文所指向的目标机器(目标机器可能是一个终端,也可能是另一个路由器)。众所周知,在两个路由器之间可能有多条通信线路,你的任务就是给出两个路由器之间最短通信时间。
每一个路由器都有一个IP来标识它自己,这个标识是唯一的。任意两点之间的通信时间单位是毫秒。每条通信线路都是全双工的(双向的)。

Input

第一行为两个整数n和m,n表示有多少个路由器,m表示有多少条通信线路。(2<=n<=100,1<=m<=1000)
接下去的m行用来描述路由器之间的线路。每行包括三个元素,两个路由器的IP地址和它们之间通信所花费的时间。
然后一行是一个整数t,表示有多少个报文。(1<=t<=1000)
接下去的t行是报文。每个报文占一行,为了简化问题,我们在每行中给出两个IP地址,分别是目标地址和源地址。你要做的就是求出两者之间的最短时间。

Output

对于每个报文,输出一行。每行只包含一个整数,表示报文给的两个IP地址之间的最短通信时间。如果不存在这样的通路,或者IP地址并不存在,则输出-1。

Sample Input

4 5
168.120.1.1 168.120.1.2 15
168.120.1.1 168.120.1.4 47
168.120.1.1 168.120.1.3 10
168.120.1.2 168.120.1.4 15
168.120.1.3 168.120.1.4 25
3
168.120.1.1 168.120.1.4
168.120.1.3 168.120.1.4
168.120.1.3 202.12.12.12

Sample Output

30
25
-1

 

题目分析:

给定一些点和点间的距离,问任意两点的最短距离,可用floyd算法,可用map建立路由器地址到点的一一对应

 

 

AC代码:

 

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <vector>

#include <map>

#include <algorithm>

 

using namespace std;

int cost[105][105];

 

int main()

{

    int n,m,i,j,k;

   while(~scanf("%d%d",&n,&m)){

        map<string,int>msi;

        for(i=0;i<105;++i)

            for(j=0;j<105;++j)

               cost[i][j]=100001;

        char s1[100],s2[100];

        int len;

        int cnt=1;

        for(i=0;i<m;++i){

           scanf("%s%s%d",s1,s2,&len);

            if(msi[s1]==0)

                msi[s1]=cnt++;

            if(!msi[s2])

                msi[s2]=cnt++;

            intx=msi[s1],y=msi[s2];

           cost[x][y]=cost[y][x]=len;

        }

        for(k=1;k<=n;++k)

            for(i=1;i<=n;++i)

               for(j=1;j<=n;++j)

                   cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);

        int q;

       scanf("%d",&q);

        while(q--){

           scanf("%s%s",s1,s2);

            intx=msi[s1],y=msi[s2];

           if(cost[x][y]<100001)

               printf("%d\n",cost[x][y]);

            elseprintf("-1\n");

        }

    }

    return 0;

}

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值