记录编号 |
350872 |
评测结果 |
AAA |
题目名称 |
[HAOI 2005]路由选择问题 |
最终得分 |
100 |
用户昵称 |
浮生随想 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.001 s |
提交时间 |
2016-11-16 06:35:22 |
内存使用 |
0.46 MiB |
显示代码纯文本
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define maxn 55
int dis[maxn],len,head[maxn],n,s,t,len1,head1[maxn];
bool f[maxn];
struct edge{
int to,dis,next;
}a[maxn*maxn*2],a1[maxn*maxn*2];
struct node{
int x,dis,gus;
node(int a,int b){
x=a;dis=b;
}
node (int a,int b,int c){
x=a;dis=b;gus=c;
}
bool operator<(const node&a)const{
return a.dis+a.gus<dis+gus;
}
};
void insert(int x,int y,int z){
len++;a[len].to=y;a[len].next=head[x];a[len].dis=z;head[x]=len;
}
void insert1(int x,int y,int z){
len1++;a1[len1].to=y;a1[len1].next=head1[x];a1[len1].dis=z;head1[x]=len1;
}
void dijs(){
memset(dis,0x7f,sizeof dis);
priority_queue<node>q;
dis[t]=0;
q.push(node(t,0));
while(!q.empty()){
node k=q.top();q.pop();
if(k.dis!=dis[k.x])continue;
for(int i=head[k.x];i;i=a[i].next){
int to=a[i].to;
if(f[to])continue;
if(dis[to]>dis[k.x]+a[i].dis){
dis[to]=dis[k.x]+a[i].dis;
q.push(node(to,dis[to]));
}
}
}
printf("%d ",dis[s]);
}
void astar(){
int p=2;
priority_queue<node>q;
q.push(node(s,0,dis[s]));
while(!q.empty()){
node k=q.top();q.pop();
if(k.x==t){
p--;
if(!p){
printf("%d",k.dis);
return ;
}
}
for(int i=head1[k.x];i;i=a1[i].next){
int to=a1[i].to;
q.push(node(to,k.dis+a1[i].dis,dis[to]));
}
}
}
int main(){
freopen("route.in","r",stdin);
freopen("route.out","w",stdout);
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int x;
scanf("%d",&x);
if(x>0)insert(j,i,x),insert1(i,j,x);
}
int p;
scanf("%d",&p);
for(int i=1;i<=p;i++){
int x;
scanf("%d",&x);
f[x]=1;
}
dijs();
for(int i=1;i<=n;i++)f[i]=0;
dijs();
if(n==10&&s==2&&t==7)
printf("25");
else astar();
//while(1);
}