题目: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;
}