/*
Dijkstra的算法思想:
在所有没有访问过的结点中选出dis(s,x)值最小的x
对从x出发的所有边(x,y),更新
dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
*/
#include<bits/stdc++.h>
using namespace std;
const int Ni = 2e5+10;
const int INF = 1<<27;
struct node{
int x,d;
node(){}
node(int a,int b){x=a;d=b;}
bool operator < (const node & a) const
{
if(d==a.d) return x<a.x;
else return d > a.d;
}
};
vector<node> eg[Ni];
int dis[Ni],n;
void Dijkstra(int s){
int i;
for(i=0;i<=n;i++) dis[i]=INF;
dis[s]=0;
//用优先队列优化
priority_queue<node> q;
q.push(node(s,dis[s]));
while(!q.empty()){
node x=q.top();q.pop();
for(i=0;i<eg[x.x].size();i++){
node y=eg[x.x][i];
if(dis[y.x]>x.d+y.d){
dis[y.x]=x.d+y.d;
q.push(node(y.x,dis[y.x]));
}
}
}
}
int main(){
int a,b,d,m;
while(scanf("%d%d",&n,&m)==2){
for(int i=0;i<=n;i++) eg[i].clear();
while(m--){
scanf("%d%d%d",&a,&b,&d);
eg[a].push_back(node(b,d));
eg[b].push_back(node(a,d));
}
Dijkstra(1);
if(dis[n]==INF)
printf("qwb baka\n");
else
printf("%d\n",dis[n]);
}
return 0;
}
未优化Dijkstra:
const int INF=0x3f3f3f3f;
const int maxn=1200;
int dist[maxn],g[maxn][maxn],N;
bool vis[maxn];
void dijkstra(){
for(int i=1;i<=N;i++)
dist[i]=(i==1)?0:INF;
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++){
int mark=-1,mindis=INF;
for(int j=1;j<=N;j++){
if(!vis[j]&&dist[j]<mindis){
mindis=dist[j];
mark=j;
}
}
vis[mark]=1;
for(int j=1;j<=N;j++){
if(!vis[j])
dist[j]=min(dist[j],dist[mark]+g[mark][j]);
}
}
}