//用dijstra算法找到Z到其余各个顶点的最小距离,然后判断最小距离中离大写字母的顶点中最小的返回
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
int maxdist=100000000;
int dest[60];
int dist[100][100];//a[][]保存各个牧场的距离,不相连就是maxdist
int s[60]={0};//s[i]保存i是否进入s集合
void dijstra(int n,int v,int dist[100][100],int s[60],int dest[60])
{
int i,j;
for(i=1;i<=v;i++)
{
dest[i]=dist[i][v];
}
dest[v]=0;
s[v]=1;
for(i=1;i<=v-1;i++)
{
int tmp=maxdist;
int u=v;
for(j=1;j<=v;j++)//找距离最小的
{
if(!s[j] && dest[j]<tmp)
{
tmp=dest[j];
u=j;
}
}
s[u]=1;
for(j=1;j<=v;j++)
{
if(!s[j] && dist[u][j]<maxdist)
{
if(dest[j]>dest[u]+dist[u][j])
dest[j]=dest[u]+dist[u][j];
}
}
}
}
int main()
{
ifstream fin ("comehome.in");
ofstream fout ("comehome.out");
int i,j,p;
for(i=1;i<=99;i++)
{
for(j=1;j<=99;j++)
{
dist[i][j]=maxdist;
}
}
for(i=1;i<=59;i++)
dest[i]=10001;
fin>>p;
for(i=1;i<=p;i++)
{
char a,b;
int d,k,l;
fin>>a>>b>>d;
//大写字母保存在27--52之间,小写字母保存在1--26之间
if(a>='A' && a<='Z')
{
k=(int)a-38;
}
else
k=(int)a-96;
if(b>='A' && b<='Z')
{
l=(int)b-38;
}
else
l=(int)b-96;
if(dist[k][l]>d)
{
dist[k][l]=d;
dist[l][k]=d;
}
}
dijstra(1,52,dist,s,dest);
int temp=maxdist;
for(i=27;i<=51;i++)
{
if(dest[i]<temp)
{
temp=dest[i];
j=i;
}
}
fout<<(char)(j+38)<<' '<<temp<<endl;
return 0;
}
Bessie Come Home
最新推荐文章于 2012-10-19 09:11:39 发布