HDU Today(Floyd)
原题:hdu2112
这是一道一般的最短路径问题,需要先处理数据一下,把给的字符串表示的地址转换成数字,这里可以用很多种方法,比如直接用char数组转换为int,string转换成int,map<string,int>pl等等很多种方法。我这里用的是string转换成int,但是第一次交的时候RE了,查了资料发现不能用memset()初始化(code::blocks居然还不报错),memset()不能用于初始化类。
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int n,j,ma=100000000;
int mp[160][160];
string st[160];
int cs(string a)
{
for(int i=0;i<j;i++)
{
if(a==st[i])
{
return i;
}
}
return -1;
} //查询地址对应的数字
void floyd()
{
for(int k=0;k<j;k++)
{
for(int i=0;i<j;i++)
{
if(mp[i][k]<ma)
{
for(int l=0;l<j;l++)
{
if(mp[k][l]<ma&&mp[i][l]>mp[i][k]+mp[k][l])
{
mp[i][l]=mp[i][k]+mp[k][l];
}
}
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=-1)
{
for(int i=0;i<160;i++)
{
st[i]="";
} //清空string数组,不能用memset().
for(int i=0;i<160;i++)
{
for(int l=0;l<160;l++)
{
if(i==l)
{
mp[i][l]=0;
}
else
{
mp[i][l]=ma;
}
}
}
j=0;
string a,b;
cin>>a>>b;
int beg,ed;
beg=cs(a);
if(beg==-1)
{
st[j]=a;
beg=j;
j++;
}
ed=cs(b);
if(ed==-1)
{
st[j]=b;
ed=j;
j++;
}
int t;
for(int i=0;i<n;i++)
{
cin>>a>>b>>t;
int f1=cs(a);
if(f1==-1)
{
st[j]=a;
f1=j;
j++;
}
int f2=cs(b);
if(f2==-1)
{
st[j]=b;
f2=j;
j++;
}
if(mp[f1][f2]>t)
{
mp[f1][f2]=mp[f2][f1]=t;
}
}
floyd();
if(mp[beg][ed]<ma)
{
printf("%d\n",mp[beg][ed]);
}
else
{
printf("-1\n");
}
}
return 0;
}