| 记录编号 |
270119 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
73.找最佳通路 |
最终得分 |
100 |
| 用户昵称 |
AntiLeaf |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.000 s |
| 提交时间 |
2016-06-14 14:28:17 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=60,maxe=maxn*maxn;
template<typename T>//默认最小堆
struct Heap{
static const int maxn=10010;
T a[maxn];
int len;
Heap(){
len=0;
}
void push(T sth){
a[++len]=sth;
for(int x=len;x^1;x>>=1){
if(a[x]<a[x>>1]){
T t=a[x];
a[x]=a[x>>1];
a[x>>1]=t;
}
else break;
}
}
T& top(){
return a[1];
}
T pop(){
T res=a[1];
a[1]=a[len--];
for(int x=1,son;;x=son){
if((x<<1)==len)son=x<<1;
else if((x<<1)>len)break;
else if(a[x<<1]<a[x<<1|1])son=x<<1;
else son=x<<1|1;
if(a[son]<a[x]){
T t=a[x];
a[x]=a[son];
a[son]=t;
}
else break;
}
return res;
}
int size(){
return len;
}
bool empty(){
return !len;
}
};
struct edge{
int to,dis;
edge* prev;
edge():to(0),dis(0x7ffffff),prev(NULL){}
}ee[maxe];
struct node{
int num,g,h;
node(){}
node(int num,int g,int h=0):num(num),g(g),h(h){}
bool operator<(const node& x)const{
return g+h<x.g+x.h;
}
};
void insert(int,int,int);
void reinsert(int,int,int);
void dijkstra(int);
void Astar(int,int,int k);
int len=0;
edge* last[maxn]={NULL},*relast[maxn]={NULL};
bool vis[maxn];
int dis[maxn];
int n,m,s,t,x,y,z;
int MAIN(){
#define MINE
#ifdef MINE
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
#endif
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
insert(x,y,1);
}
dijkstra(s);
printf("%d",dis[t]+1);
return 0;
}
void insert(int x,int y,int z){
ee[len].to=y;
ee[len].dis=z;
ee[len].prev=last[x];
last[x]=&ee[len++];
}
void dijkstra(int x){
int y;
memset(vis,0,sizeof(vis));
Heap<node>heap;
heap.push(node(x,0));
while(!heap.empty()){
node b=heap.pop();
x=b.num;
vis[x]=true;
dis[x]=b.g;
if(x==t)return;
for(edge* e=last[x];e;e=e->prev){
y=e->to;
if(vis[y])continue;
heap.push(node(y,b.g+e->dis));
}
}
}
int haha=MAIN();
int main(){;}