记录编号 164125 评测结果 AAAAAAAAAA
题目名称 我们的铁骑 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 2.389 s
提交时间 2015-05-28 15:50:31 内存使用 10.40 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int SIZEN=100010;
vector<int> c_con[SIZEN];//邻接表
vector<pair<int,double> > cs[SIZEN];
vector<pair<int,double> > ct[SIZEN];
int n,m;
int s,t;
double fs[SIZEN]={0},ft[SIZEN]={0};
double L[SIZEN]={0},S[SIZEN]={0};
double att[SIZEN]={0};
void read(void){
	scanf("%d%d",&n,&m);
	s=1,t=n;
	int i;
	for(i=1;i<=n;i++) cin>>L[i];
	for(i=1;i<=n;i++) cin>>S[i];
	for(i=1;i<=n;i++) att[i]=min(L[i],S[i]);
	int a,b;
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		c_con[a].push_back(b);
		c_con[b].push_back(a);
	}
}
void makegraph_s(void){
	int i,j;
	double temp;
	for(i=1;i<=n;i++){
		for(j=0;j<c_con[i].size();j++){
			cs[i].push_back(make_pair(c_con[i][j],0));
		}
	}
	for(i=1;i<=n;i++){
		for(j=0;j<cs[i].size();j++){
			cs[i][j].second+=att[i]/2;
			cs[i][j].second+=att[cs[i][j].first]/2;
		}
	}
}
void makegraph_t(void){
	int i,j;
	double temp;
	for(i=1;i<=n;i++){
		for(j=0;j<c_con[i].size();j++){
			ct[i].push_back(make_pair(c_con[i][j],0));
		}
	}
	for(i=1;i<=n;i++){
		for(j=0;j<ct[i].size();j++){
			ct[i][j].second=S[ct[i][j].first]/2;
		}
	}
}
void Dijkstra_s(int s,double f[SIZEN]){
	double INF=1e18;
	priority_queue<pair<double,int> > q;
    bool l[SIZEN]={0};l[s]=1;
    fill_n(f,n+1,INF);f[s]=0;
    q.push(make_pair(-f[s],s));
	int i;
    while(!q.empty()){
        int u=q.top().second;q.pop();
        for(int i=0;i<cs[u].size();i++){
            int v=cs[u][i].first;
            if(f[v]>f[u]+cs[u][i].second){
                f[v]=f[u]+cs[u][i].second;
                if(!l[v]){
                    l[v]=1;
                    q.push(make_pair(-f[v],v));
                }
            }
        }
    }
	for(i=1;i<=n;i++){
		f[i]+=att[s]/2;
		f[i]+=att[i]/2;
	}
}
void Dijkstra_t(int s,double f[SIZEN]){
	double INF=1e18;
	priority_queue<pair<double,int> > q;
    bool l[SIZEN]={0};l[s]=1;
    fill_n(f,n+1,INF);f[s]=0;
    q.push(make_pair(-f[s],s));
	int i;
    while(!q.empty()){
        int u=q.top().second;q.pop();
        for(int i=0;i<ct[u].size();i++){
            int v=ct[u][i].first;
            if(f[v]>f[u]+ct[u][i].second){
                f[v]=f[u]+ct[u][i].second;
                if(!l[v]){
                    l[v]=1;
                    q.push(make_pair(-f[v],v));
                }
            }
        }
    }
	for(i=1;i<=n;i++){
		f[i]+=S[s];
		f[i]-=S[i]/2;
	}
}
void work(void){
	double ans=fs[n];
	int i;
	for(i=1;i<n;i++){
		if(fs[i]+ft[i]<ans){
			ans=fs[i]+ft[i];
		}
	}
	cout<<(long long)ans<<endl;
}
int main(){
	freopen("tank.in","r",stdin);
	freopen("tank.out","w",stdout);
	read();
	makegraph_s();
	makegraph_t();
	Dijkstra_s(s,fs);
	Dijkstra_t(t,ft);
	fs[n+1]=ft[n+1]=0;
	work();
	return 0;
}