记录编号 350872 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatar浮生随想 是否通过 通过
代码语言 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);
}