您的位置:首页 > 其它

usaco 2.4.4 comehome

2012-08-03 10:36 211 查看
研究了几天最短路径,果然对图论还是很难有兴趣啊!第一次写迪杰斯特拉算法,写的超级烂,有空改改再优化下,好好想清楚细节方面……下面贴出代码以作纪念。

View Code

/*{
ID:jzy3209981
PROG:comehome
LANG:C++
}*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;

int shortest[60];
int distances[5000][2];
int gragh[60][60];
int visit[60];
int visitt[60][60];
void dstr()
{
int po=0,j=0,i,shortpoint,p,minn,nowpoint,changep,nowdis=0;
visit['Z'-65]=1;
nowpoint='Z'-65;
int change[2];
while(po<=j)
{
minn=100000;
for(i=0;i<58;i++)
if(gragh[nowpoint][i]!=0&&visitt[nowpoint][i]!=1)
{
distances[j][0]=gragh[nowpoint][i]+nowdis;
distances[j][1]=i;
visitt[nowpoint][i]=1;
j++;
}
for(p=po;p<j;p++)
if(distances[p][0]<minn&&visit[distances[p][1]]!=1)
{
minn=distances[p][0];
shortpoint=distances[p][1];
changep=p;
}
nowdis=distances[changep][0];
nowpoint=shortpoint;
change[0]=distances[changep][0];
change[1]=distances[changep][1];
distances[changep][0]=distances[po][0];
distances[changep][1]=distances[po][1];
distances[po][0]=change[0];
distances[po][1]=change[1];
po++;
visit[nowpoint]=1;
shortest[nowpoint]=minn;
}
}
int main()
{
freopen ("comehome.in","r",stdin);
freopen ("comehome.out","w",stdout);
int p,i,dis,po;
char start[2],end[2];
int    minn=10000000;
scanf("%d",&p);
for(i=0;i<p;i++)
{
scanf("%s%s%d",start,end,&dis);
if((gragh[start[0]-65][end[0]-65]!=0&&gragh[start[0]-65][end[0]-65]>dis)||gragh[start[0]-65][end[0]-65]==0)
{
gragh[start[0]-65][end[0]-65]=dis;
gragh[end[0]-65][start[0]-65]=dis;
}

}
dstr();
for(i=0;i<25;i++)
if(shortest[i]<minn&&shortest[i]!=0)
{
minn=shortest[i];
po=i;
}
printf("%c %d\n",po+65,minn);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: