luogu2865 路障 (dijkstra)
求次短路,dijkstra时同时记下到某点的最短距离和次短距离即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 #include<map> 7 #include<cmath> 8 #include<ctime> 9 #include<set> 10 #define pa pair<int,int> 11 #define lowb(x) ((x)&(-(x))) 12 #define REP(i,n) for(i=1;i<=n;i++) 13 #define MAX(a,b) ((a>b)?a:b) 14 #define MIN(a,b) ((a<b)?a:b) 15 #define CLR(a,x) memset(a,x,sizeof(a)) 16 #define rei register int 17 using namespace std; 18 const int maxn=5050,maxm=100010; 19 typedef long long ll; 20 21 ll rd(){ 22 ll x=0;char c=getchar();int neg=1; 23 while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} 24 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 25 return x*neg; 26 } 27 28 struct Edge{ 29 int a,b,l,ne; 30 }eg[maxm*2]; 31 int M,N,egh[maxn],ect; 32 int dis[maxn][2]; 33 priority_queue<pa,vector<pa>,greater<pa> > q; 34 35 inline void adeg(int a,int b,int l){ 36 eg[ect].a=a;eg[ect].b=b;eg[ect].l=l; 37 eg[ect].ne=egh[a];egh[a]=ect++; 38 } 39 40 inline void change(int x,int d){ 41 if(d<dis[x][0]){ 42 dis[x][1]=dis[x][0];dis[x][0]=d; 43 q.push(make_pair(d,x)); 44 }else if(d<dis[x][1]&&d>dis[x][0]){ 45 dis[x][1]=d;q.push(make_pair(d,x)); 46 } 47 } 48 49 void dijkstra(){ 50 CLR(dis,127); 51 dis[1][0]=0;q.push(make_pair(0,1)); 52 while(!q.empty()){ 53 int p=q.top().second;q.pop(); 54 for(int i=egh[p];i!=-1;i=eg[i].ne){ 55 int b=eg[i].b; 56 change(b,dis[p][0]+eg[i].l);change(b,dis[p][1]+eg[i].l); 57 } 58 } 59 } 60 61 int main(){ 62 //freopen(".in","r",stdin); 63 rei i,j,k; 64 N=rd(),M=rd();CLR(egh,-1); 65 REP(i,M){ 66 int a=rd(),b=rd(),c=rd(); 67 adeg(a,b,c);adeg(b,a,c); 68 }//printf("lll\n"); 69 dijkstra(); 70 71 printf("%d\n",dis[N][1]); 72 return 0; 73 }