记录编号 34000 评测结果 AAAAAAAAAA
题目名称 找最佳通路 最终得分 100
用户昵称 GravatarQhelDIV 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2011-11-24 21:51:29 内存使用 0.27 MiB
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fin("city.in");
ofstream fout("city.out");

int Map[51][51],D[51],n,MemberNum;
int From,To,NodePos[51];
bool flag[51];
class HEAP
{
public:
	int Data,Name;
	int Ls,Rs;
}heap[51];

void Swap(int *p,int *q)
{
	int tmp;
	tmp=*p;
	*p=*q;
	*q=tmp;
}

void Init()
{
int i;
int m;
	fin>>n>>m>>From>>To;
	int s,e;
	for(i=1;i<=m;i++)
	{
		fin>>s>>e;
		Map[s][e]=1;
	}
}
void Init_Single_Sourse()
{
	int i;
	for(i=1;i<=n;i++)
	{
		heap[i].Ls=i<<1;
		heap[i].Rs=heap[i].Ls+1;
	}
	heap[1].Name=From;
	NodePos[From]=1;
	MemberNum=1;
}

void Min_Heapify(int pos)
{
	int R,L,Minpos;
	R=heap[pos].Rs;
	L=heap[pos].Ls;
	Minpos=pos;
	
	if(L>=n && heap[Minpos].Data > heap[L].Data)
		Minpos=L;
	if(R>=n && heap[Minpos].Data > heap[R].Data)
		Minpos=R;
	if(Minpos!=pos)
	{
		Swap(&heap[Minpos].Data,&heap[pos].Data);
		Swap(&heap[Minpos].Name,&heap[pos].Name);
		Swap(&NodePos[heap[Minpos].Name],&NodePos[heap[pos].Name]);
		Min_Heapify(Minpos);
	}
}

void Dec(int pos)
{
int Next,i=pos;
	for(Next=i>>1; Next | 0; (i>>=1),(Next>>=1))
		if(heap[Next].Data > heap[i].Data)
		{
			Swap(&heap[i].Data,&heap[Next].Data);
			Swap(&heap[i].Name,&heap[Next].Name);
			Swap(&NodePos[heap[i].Name],&NodePos[heap[Next].Name]);
		}		
		else
			break;
}

void Extract_Min()
{
	NodePos[heap[MemberNum].Name]=1;
	
	Swap(&heap[1].Data,&heap[MemberNum].Data);
	Swap(&heap[1].Name,&heap[MemberNum].Name);
	
	NodePos[heap[MemberNum].Name]=0;
	
	MemberNum--;
	Min_Heapify(1);
}
void Dijkstra()
{
int Minpos,i;
	Init_Single_Sourse();
	for(;MemberNum | 0;)
	{
		Minpos=heap[1].Name;
		flag[Minpos]=true;
		NodePos[Minpos]=1;
		D[Minpos]=heap[1].Data;
		Extract_Min();
		for(i=1;i<=n;i++)
			if(Map[Minpos][i] && !flag[i])
			{
				if(NodePos[i]==0)
				{
					MemberNum++;
					heap[MemberNum].Data=D[Minpos]+Map[Minpos][i];
					heap[MemberNum].Name=i;
					NodePos[heap[MemberNum].Name]=MemberNum;
					Dec(MemberNum);
				}
				else
				{
					int U=Map[Minpos][i] + D[Minpos];
					if(U < heap[NodePos[i]].Data)
					{
						heap[NodePos[i]].Data=U;
						Dec(NodePos[i]);
					}
				}
			}
		
	}
}

int main()
{
	Init();
	
	Dijkstra();
	
	fout<<D[To]+1<<endl;
	
	fin.close();
	fout.close();
	return 0;
}
/*
		Swap(&,&);
		Swap(&,&);
		Swap(&,&);
*/