本人代码:
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
while('0'<=c&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
const int N=5e3+5,M=1e5+5,inf=0x3f3f3f3f3f3f3f3f;
int n,m,dis[N][2];
bool vis[N][2];
struct edge{
int nxt,v,w;
}ed[M];
int en,first[N];
void add(int u,int v,int w){
ed[++en]={first[u],v,w};
first[u]=en;
}
void dij(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
priority_queue<pair<int,pii> >q;
q.push(mk(0,mk(0,s)));dis[s][0]=0;
while(!q.empty()){
int u=q.top().second.second,e=q.top().second.first;q.pop();
if(vis[u][e])continue;
vis[u][e]=1;
for(int i=first[u];i;i=ed[i].nxt){
if(dis[ed[i].v][0]>dis[u][e]+ed[i].w)
dis[ed[i].v][1]=dis[ed[i].v][0],q.push(mk(-dis[ed[i].v][1],mk(1,ed[i].v))),
dis[ed[i].v][0]=dis[u][e]+ed[i].w,q.push(mk(-dis[ed[i].v][0],mk(0,ed[i].v)));
else if(dis[ed[i].v][1]>dis[u][e]+ed[i].w)
dis[ed[i].v][1]=dis[u][e]+ed[i].w,q.push(mk(-dis[ed[i].v][1],mk(1,ed[i].v)));
}
}
return;
}
signed main(){
memset(first,0,sizeof(first));en=0;
n=read();m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
dij(1);
printf("%lld",dis[n][1]);
return 0;
}
题解的代码:
#include<stdio.h>
#include <iostream>
#include<string.h>
#include <queue>
#include<math.h>
#include <vector>
#define MAX 99999999
using namespace std;
//优先队列优化版的dijk
int num[5005],num2[5005];
int n,s,t;
struct edge
{
int to;
int cost;
bool operator < (const edge & a) const
{
return cost> a.cost;
}
};
vector<edge>g[5005];
priority_queue<edge> vis;
void dijkstra()
{
int i,j;
for(i=1; i<=n; i++)
num[i]=MAX,num2[i]=MAX;
num[s]=0;
vis.push((edge)
{
s,0
});
while(!vis.empty())
{
edge node=vis.top();
vis.pop();
for(i=0; i<g[node.to].size(); i++)
{
if(num[g[node.to][i].to]>=num[node.to]+g[node.to][i].cost)
{
num[g[node.to][i].to]=num[node.to]+g[node.to][i].cost;
vis.push((edge)
{
g[node.to][i].to,num[g[node.to][i].to]
});
}
else if(num2[g[node.to][i].to]>num[node.to]+g[node.to][i].cost)
{
num2[g[node.to][i].to]=num[node.to]+g[node.to][i].cost;
vis.push((edge)
{
g[node.to][i].to,num[g[node.to][i].to]
});
}
if(num2[g[node.to][i].to]>g[node.to][i].cost+num2[node.to])
num2[g[node.to][i].to]=g[node.to][i].cost+num2[node.to];
}
}
}
int main()
{
int i,j,x,y,z,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
edge tmp;
s=1;
for(i=0; i<m; i++)
{
scanf("%d%d%d",&x,&tmp.to,&tmp.cost);
g[x].push_back(tmp);
int t=tmp.to;
tmp.to=x;
g[t].push_back(tmp);
}
dijkstra();
printf("%d\n",num2[n]);
}
return 0;
}
输入:
5 5
1 2 5
2 3 5
3 4 4
4 5 6
1 5 21
输出:
21
我的是21,分数90,但题解区28的却都过了