题目描述
现在有n个结点,m条无向边,其中1<n<1000,1<m<5003,起点是1,终点是n。求1到n的最短路径。
输入样例
5 6
1 2 2
2 3 3
2 5 5
3 4 2
3 5 1
4 5 1
输出样例
6
dijkstra
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int e[N][N],n,m;
void init(){
rep(i,1,n) rep(j,1,n){
e[i][j] = i == j ? 0 : inf ;
}
}
int dijkstra(int stra,int end){
int dis[N],minv,minx; bool vis[N];
rep(i,2,n) dis[i] = inf;
dis[1] = 0 ;
mset(vis,0);
for (int ai = 1; ai <= n; ai++){
minv = inf;
for (int bi = 1; bi <= n; bi++){
if ( vis[bi] == 0 && minv > dis[bi]){
minv = dis[bi]; minx = bi ;
}
}
vis[minx] = 1;
for (int bi = 1; bi <= n; bi++){
if ( vis[bi] == 0 && dis[bi] > dis[minx] + e[minx][bi] ){
dis[bi] = dis[minx] + e[minx][bi];
}
}
}
return dis[n];
}
int main()
{
n = read(); m = read();
init();
rep(i,1,m){
int a,b,c;
a = read(); b = read(); c = read();
e[a][b] = e[b][a] = c;
}
printf("%d\n",dijkstra(1,n));
return 0;
}
bellman_ford
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int n,m;int dis[N];
struct {
int u,v,w;
}e[10009];
void init(){
}
int bell_man(int stra,int end){
mset(dis,0x3f);
dis[stra] = 0;
for (int ai = 1; ai <= n; ai++){
for (int bi = 1; bi <= 2*m; bi++){
if ( dis[e[bi].v] > dis[e[bi].u] + e[bi].w ){
dis[e[bi].v] = dis[e[bi].u] + e[bi].w;
}
}
}
return dis[end];
}
int main()
{
// freopen("D:\\垃圾程序存储\\1.txt","r",stdin);
// srand((int)time(0));
// std::ios::sync_with_stdio(false);
n = read(); m = read();
init();
rep(i,1,m){
int a,b,c;
a = read(); b = read(); c = read();
e[i].u = a; e[i].v = b; e[i].w = c;
e[i+m].u = b ; e[i+m].v = a; e[i+m].w = c;
}
printf("%d\n",bell_man(1,n));
return 0;
}
SPFA
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
int n,m;
struct Ead{
int u,v,w,nx;
}e[10009];int hea[1003];int tot = 0 ;
void init(){
tot = 0 ; mset(hea,0);
}
void add_ead(int u,int v,int w){
++tot;
e[tot].u = u ; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u] ; hea[u] = tot;
}
int SPFA(int stra,int end){
int dis[N];bool inq[N];
mset(dis,0x3f);
mset(inq,0);
queue<int>q;
inq[stra] = 1; dis[stra] = 0;
q.push(stra);
while ( !q.empty() ){
int u = q.front(); q.pop();
inq[stra] = 0 ;
for (int i = hea[u] ; i ; i = e[i].nx){
if ( dis[e[i].v] > dis[e[i].u] + e[i].w){
dis[e[i].v] = dis[e[i].u] + e[i].w;
if ( !inq[e[i].v]){
q.push(e[i].v);
}
}
}
}
return dis[end];
}
int main()
{
n = read(); m = read();
init();
rep(i,1,m){
int a,b,c;
a = read(); b = read(); c = read();
add_ead(a,b,c);
add_ead(b,a,c);
}
printf("%d\n",SPFA(1,n));
return 0;
}
dijkstra + priority_queue
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 1003
#define M 5009
int n,m;
struct Ead{
int u,v,w,nx;
Ead() {}
Ead(int _u,int _v,int _w,int _nx){
u = _u ;
v = _v ;
w = _w;
nx = _nx;
}
}e[10009];
struct Node {
int u,w;
bool operator < (const Node &x )const{
return w > x.w;
}
Node (int _u,int _w){
u = _u ;
w = _w ;
}
};
int hea[1003];int tot = 0 ;
void init(){
tot = 0 ; mset(hea,0);
}
void add_ead(int u,int v,int w){
++tot;
e[tot].u = u ; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u] ; hea[u] = tot;
}
int dijkstra(int stra,int end){
int dis[N];
mset(dis,0x3f);
dis[stra] = 0 ;
priority_queue<Node> q;
q.push(Node(stra,0));
while ( !q.empty() ){
Node x = q.top() ; q.pop();
if ( x.w != dis[x.u] ) continue;
for (int i = hea[x.u] ; i ; i = e[i].nx){
if ( dis[e[i].v] > dis[e[i].u] + e[i].w){
dis[e[i].v] = dis[e[i].u] + e[i].w;
q.push(Node(e[i].v,dis[e[i].v]));
}
}
}
return dis[end];
}
int main()
{
// freopen("D:\\垃圾程序存储\\1.txt","r",stdin);
// srand((int)time(0));
// std::ios::sync_with_stdio(false);
n = read(); m = read();
init();
rep(i,1,m){
int a,b,c;
a = read(); b = read(); c = read();
add_ead(a,b,c);
add_ead(b,a,c);
}
printf("%d\n",dijkstra(1,n));
return 0;
}