赤裸裸的模板题。。
如果没有负边就用dij的堆优化
否则的话就用spfa
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
/* dijkstra
*/
const int maxn=1000*2;
struct Node
{ int v;
int w;
Node(){};
Node(int _a,int _b){v=_a;w=_b;}
};
int d[maxn];
int m,n;
vector<Node>G[maxn];
struct cmp
{bool operator()(pair<int,int> a,pair<int,int> b )
{ return a.first>b.first;//从大到小排序,但是小的权值大,所以先弹小的
//一句话,这和普通的排序是相反的。
}
};
void add(int a,int b,int c)
{ G[a].push_back(Node(b,c));
G[b].push_back(Node(a,c));
}
void init()
{ for(int i=1;i<=m;i++)
d[i]=1e9;
for(int i=0;i<maxn;i++)
G[i].clear();
}
int dijkstra()
{ priority_queue<pair<int,int> ,vector<pair<int,int> >,cmp>q;
d[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{ int u=q.top().second;
q.pop();
for(int i=0;i<G[u].size();i++)
{ int s=G[u][i].v;
if(d[s]>d[u]+G[u][i].w)
{ d[s]=d[u]+G[u][i].w;
q.push(make_pair(d[s],s));
}
}
}
}
int main()
{ int a,b,c;
ios::sync_with_stdio(false);
while(cin>>m>>n)
{if(m==0&&n==0) break;
init();
for(int i=0;i<n;i++)
{ cin>>a>>b>>c;
add(a,b,c);
}
dijkstra();
cout<<d[m]<<endl;}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
/* dijkstra
*/
const int maxn=1000*2;
struct Node
{ int v;
int w;
Node(){};
Node(int _a,int _b){v=_a;w=_b;}
};
int d[maxn];
int m,n;
vector<Node>G[maxn];
bool vis[maxn];
struct cmp
{bool operator()(pair<int,int> a,pair<int,int> b )
{ return a.first>b.first;
}
};
void add(int a,int b,int c)
{ G[a].push_back(Node(b,c));
G[b].push_back(Node(a,c));
}
void init()
{ for(int i=1;i<=m;i++)
d[i]=1e9;
for(int i=1;i<=m;i++)
vis[i]=false;
for(int i=0;i<maxn;i++)
G[i].clear();
}
int spfa()
{ queue<int>q;
q.push(1);
d[1]=0;
vis[1]=true;
while(!q.empty())
{ int u=q.front();
q.pop();
vis[u]=false;
for(int i=0;i<G[u].size();i++)
{ int s=G[u][i].v;
if(d[s]>d[u]+G[u][i].w)
{d[s]=d[u]+G[u][i].w;
if(!vis[s])
{vis[s]=true;
q.push(s);
}
}
}
}
}
int main()
{ int a,b,c;
ios::sync_with_stdio(false);
while(cin>>m>>n)
{if(m==0&&n==0) break;
init();
for(int i=0;i<n;i++)
{ cin>>a>>b>>c;
add(a,b,c);
}
spfa();
cout<<d[m]<<endl;}
return 0;
}