1. 程式人生 > >【CCF】地鐵修建 改編Dijkstra

【CCF】地鐵修建 改編Dijkstra

dijkstra scanf pty cst turn false AC void ostream

【題意】

給定有n個點,m條邊的無向圖,沒有平行邊和自環,求從1到n的路徑中,最長段的最小值(最短路不再是路徑和,而是所有段中的最大值)

【AC】

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
const int maxn=1e5+2;
const int maxm=2e5+2
; const int inf=0x3f3f3f3f; int n,m; struct edge{ int to; int nxt; int w; }e[2*maxm]; struct node{ int id; int d; node(int _id,int _d):id(_id),d(_d){} bool operator < (const node& a) const{ return d>a.d; } }; int dis[maxn]; bool vis[maxn]; int head[maxn];
int tot; void init(){ memset(head,-1,sizeof(head)); tot=0; } void add(int u,int v,int w){ e[tot].to=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot++; } int work(){ memset(dis,inf,sizeof(dis)); memset(vis,false,sizeof(vis)); dis[1]=0; priority_queue<node> Q; Q.push(node(
1,dis[1])); while(!Q.empty()){ node q=Q.top(); Q.pop(); int u=q.id; if(vis[u]) continue; vis[u]=true; for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; int w=e[i].w; int tmp=max(q.d,w); if(tmp<dis[v]){ dis[v]=tmp; Q.push(node(v,dis[v])); } } } return dis[n]; } int main(){ while(~scanf("%d%d",&n,&m)){ init(); int u,v,w; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } int ans=work(); printf("%d\n",ans); } return 0; }

【CCF】地鐵修建 改編Dijkstra