比赛 |
202110省实验桐柏一中普及组联赛 |
评测结果 |
WEAWWWEEEE |
题目名称 |
旅游纪念 |
最终得分 |
10 |
用户昵称 |
佚名 |
运行时间 |
1.017 s |
代码语言 |
C++ |
内存使用 |
3.00 MiB |
提交时间 |
2021-10-18 20:50:22 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1009,INF=1e7,M=10009;
int d[N],dd[N],s[N],n,m,head[N][2]={0},cnt[2]={0},visit[N][2]={0},maxx=INF;
struct Edge
{
int to,w,nxt;
}edge[M][2];
int add(int u,int v,int w)
{
cnt[0]++;
edge[cnt[0]][0].to=v;
edge[cnt[0]][0].w=w;
edge[cnt[0]][0].nxt=head[u][0];
head[u][0]=cnt[0];
return 0;
}
int ad(int u,int v,int w)
{
cnt[1]++;
edge[cnt[1]][1].to=v;
edge[cnt[1]][1].w=w;
edge[cnt[1]][1].nxt=head[u][1];
head[u][1]=cnt[1];
return 0;
}
int dijkstra(int s)
{
priority_queue<PII,vector<PII>,greater<PII> >q;
for(int i=1;i<=n;i++)
{
d[i]=INF;
}
d[s]=0;
q.push(make_pair(d[s],s));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(visit[u][0])
{
continue;
}
visit[u][0]++;
for(int i=head[u][0];i!=0;i=edge[i][0].nxt)
{
int v=edge[i][0].to,w=edge[i][0].w;
if(!visit[v][0]&&d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push(make_pair(d[v],v));
}
}
}
for(int i=1;i<=n;i++)
{
if(dd[i]==INF)
{
dd[i]=-1;
continue;
}
dd[i]=d[i];
}
return 0;
}
int dij(int s)
{
priority_queue<PII,vector<PII>,greater<PII> >q;
for(int i=1;i<=n;i++)
{
d[i]=INF;
}
d[s]=0;
q.push(make_pair(d[s],s));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(visit[u][1])
{
continue;
}
visit[u][1]++;
for(int i=head[u][1];i!=0;i=edge[i][1].nxt)
{
int v=edge[i][1].to,w=edge[i][1].w;
if(!visit[v][1]&&d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push(make_pair(d[v],v));
}
}
}
for(int i=1;i<=n;i++)
{
if(d[i]==INF)
{
dd[i]=-1;
}
if(dd[i]!=-1)
{
dd[i]=dd[i]+d[i];
}
}
return 0;
}
int main()
{
freopen("keepsake.in","r",stdin);
freopen("keepsake.out","w",stdout);
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
ad(y,x,z);
}
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
dijkstra(1);
dij(n);
for(int i=1;i<=n;i++)
{
if(dd[i]==-1)
{
continue;
}
dd[i]=dd[i]-(max(s[i],s[n])-s[1]);
maxx=min(maxx,dd[i]);
}
cout<<maxx<<endl;
return 0;
}