USACO2.4 Bessie Come Home(comehome)

        基本的最短路的題,利用迪傑斯特拉算法計算各點到Z的最短距離,輸出知足要求的答案便可。須要注意的一點是對輸入的處理,這裏利用兩個數組對輸入進行數字化和保存原字符值,方便處理和輸出,利用空間節約了時間。ios

 

/*
ID:jzzlee1
PROB:comehome
LANG:C++
*/
//#include <iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream cin("comehome.in");
ofstream cout("comehome.out");
/*w[][]記錄點到點的權,v[]記錄是否使用過該點,d[]保存各點到Z的最短距離,flag[]將出現的牧場名字數字化。*/
int w[100][100],v[100],d[100],flag[100],cnt;
char ch[100];//ch記錄數字表明的牧場原名字
int main()
{
	int i,j,m,len;
	cin>>m;
	char ch1,ch2;
	for(i=0;i!=100;++i)				//初始化w[][]
		for(j=0;j!=100;j++)
		{
			if(i==j)
				w[i][j]=0;
			else
				w[i][j]=1<<20;
		}
		memset(flag,-1,sizeof(flag));//初始化flag[]
	cnt=1;
	for(i=0;i!=m;++i)				//處理輸入數據
	{
		cin>>ch1>>ch2>>len;
		if(ch1!='Z'&&ch2!='Z')
		{
			if(flag[ch1-'A']==-1)
			{
				ch[cnt]=ch1;
				flag[ch1-'A']=cnt++;
			}
			if(flag[ch2-'A']==-1)
			{
				ch[cnt]=ch2;
				flag[ch2-'A']=cnt++;
			}
			if(w[flag[ch1-'A']][flag[ch2-'A']]>len)
				w[flag[ch1-'A']][flag[ch2-'A']]=w[flag[ch2-'A']][flag[ch1-'A']]=len;
		}
		else if(ch1=='Z')
		{
			if(flag[ch2-'A']==-1)
			{
				ch[cnt]=ch2;
				flag[ch2-'A']=cnt++;
			}
			if(w[0][flag[ch2-'A']]>len)
				w[0][flag[ch2-'A']]=w[flag[ch2-'A']][0]=len;
		}
		else
		{
			if(flag[ch1-'A']==-1)
			{
				ch[cnt]=ch1;
				flag[ch1-'A']=cnt++;
			}
			if(w[flag[ch1-'A']][0]>len)
				w[0][flag[ch1-'A']]=w[flag[ch1-'A']][0]=len;
		}
	}
	for(i=0;i!=cnt;++i)				//初始化d[i]
		d[i]=(i==0?0:1<<20);
	for(i=0;i!=cnt;++i)				//迪傑斯特拉算法求最短路
	{
		int x,m=1<<20;
		for(int y=0;y<cnt;y++)
			if(!v[y]&&d[y]<=m)
				m=d[x=y];
		v[x]=1;
		for(int y=0;y<cnt;y++)
			d[y]=d[y]<d[x]+w[x][y]?d[y]:d[x]+w[x][y];
	} 
	int ans=1<<20;char bns;
	for(i=1;i!=cnt;i++)					//輸出結果
	{
		if(d[i]<ans&&ch[i]>='A'&&ch[i]<'Z')
		{
			ans=d[i];
			bns=ch[i];
		}
	}
	cout<<bns<<" "<<ans<<endl;
	return 0;
}
相關文章
相關標籤/搜索