路由器

来源:互联网 发布:37pao软件下载 编辑:程序博客网 时间:2024/04/28 09:01
路由器
Time Limit:1000MS Memory Limit:30000KB

Description 

路由器是网络中用来转发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



这道题明显的求最短距离,立马联想到dijkstra算法和Floyd算法,但是dijkstra算法和Floyd算法有个明显的区别,就是dijkstra算法是求某一固定结点到其他所有结点中距离最短路径长度。Floyd算法是求任意两个结点之间的最短路径长度。当然你在dijkstra算法外再套一层for循环,N次调用dijkstra算法也能达到Floyd算法同样的效果,但那样就没必要了,况且还不能计算负权值的边,直接用Floyd算法就好,结合题目也是求给定节点对之间的最短距离,因此用Floyd算法求解即可。Floyd算法大家应该都很熟悉吧,这里就不在详细阐述了。只是简单的说下算法原理:设d(i,j)为结点i到结点j的最短距离,若结点i到结点j之间经过结点k,那么结点i到结点j的最短路径长度为:。就这么简单。。。

具体到这道题,有几个注意点:
#1: 题目没说多组测试数据,但是经过验证测试用例有多组数据
#2:题目给出的路由器地址是字符串,要转化为邻接矩阵存储这个图,然后用Floyd算法,这里可以用map<string,int>进行字符串和数组下标的转化。
#3:最后t组点对,用while(t--),别用for循环,否则用回车会陷入死循环,输出多余的数组。

最后把代码贴出来:


#include <iostream>#include <string>#include <cstring>#include <map>using namespace std;int r[110][110];const int INF = 1000000;void floyd(int n)//Floyd算法{    for(int k = 1; k <= n; ++k)    {        for(int i = 1; i <= n; ++i)        {            for(int j = 1; j <= n; ++j)            {                r[i][j] = min(r[i][j],r[i][k] + r[k][j]);            }        }    }}int main(){    int n,m;    while(cin >> n >> m)    {        string source,des;        int time;        memset(r,0,sizeof(r));        for(int i = 1; i <= n; ++i)        {            for(int j = 1; j <= n; ++j)            {                r[i][j] = INF;            }        }        map<string,int> ma;        int num = 1;        for(int i = 0; i < m; ++i)        {            cin >> source >> des >> time;            if(ma[source] == 0)            {                ma[source] = num++;            }            if(ma[des] == 0)            {                ma[des] = num++;            }            r[ma[source]][ma[des]] = time;            r[ma[des]][ma[source]] = time;        }        floyd(n);        int t;        cin >> t;        while(t--)        {            int short_distance;            cin >> source >> des;            if(ma[source] == 0 || ma[des] == 0 || r[ma[source]][ma[des]] == INF)            {                short_distance = -1;            }            else            {                short_distance = r[ma[source]][ma[des]];            }            cout << short_distance << endl;        }    }    return 0;}



0 0