记录编号 |
34000 |
评测结果 |
AAAAAAAAAA |
题目名称 |
找最佳通路 |
最终得分 |
100 |
用户昵称 |
QhelDIV |
是否通过 |
通过 |
代码语言 |
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(&,&);
*/