三种方法
1 dijkstra的堆优化
2 bellman的队列优化
3 floyd
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <string>
using namespace std;
const int maxn=300;
struct Node
{ int w,to;
Node(int _a,int _b){w=_a;to=_b;}
};
vector<Node>G[maxn];
void init()
{ for(int i=0;i<maxn;i++)
G[i].clear();
}
struct cmp
{ bool operator()(pair<int,int>a,pair<int,int>b){
return a.first>b.first;
};
};
int main()
{ int m,n;
int a,b,c;
while(cin>>m>>n)
{ init();
for(int i=1;i<=n;i++)
{cin>>a>>b>>c;
G[a].push_back(Node(c,b));
G[b].push_back(Node(c,a));
}
cin>>a>>b;
priority_queue<pair<int,int> ,vector<pair<int,int> >,cmp>q;
bool vis[maxn];
int d[maxn];
memset(vis,false,sizeof(vis));
memset(d,0x3f,sizeof(d));
q.push(make_pair(0,a));
d[a]=0;
vis[a]=true;
while(!q.empty())
{ int u=q.top().second;
q.pop();
vis[u]=false;
for(int i=0;i<G[u].size();i++)
{ int s=G[u][i].to;
if(d[s]>G[u][i].w+d[u])
{ d[s]=G[u][i].w+d[u];
if(!vis[s])
{ q.push(make_pair(d[s],s));
vis[s]=true;
}
}
}
}
if(d[b]==0x3f3f3f3f)
puts("-1");
else
cout<<d[b]<<endl;
}
return 0;
}
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <string>
using namespace std;
const int maxn=300;
struct Node
{ int w,to;
Node(int _a,int _b){w=_a;to=_b;}
};
vector<Node>G[maxn];
void init()
{ for(int i=0;i<maxn;i++)
G[i].clear();
}
int main()
{ int m,n;
int a,b,c;
while(cin>>m>>n)
{ init();
for(int i=1;i<=n;i++)
{cin>>a>>b>>c;
G[a].push_back(Node(c,b));
G[b].push_back(Node(c,a));
}
cin>>a>>b;
queue<int>q;
bool vis[maxn];
int d[maxn];
memset(vis,false,sizeof(vis));
memset(d,0x3f,sizeof(d));
q.push(a);
d[a]=0;
vis[a]=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].to;
if(d[s]>G[u][i].w+d[u])
{ d[s]=G[u][i].w+d[u];
if(!vis[s])
{ q.push(s);
vis[s]=true;
}
}
}
}
if(d[b]==0x3f3f3f3f)
puts("-1");
else
cout<<d[b]<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
using namespace std;
int dp[202][202];
int main()
{ //ios::sync_with_stdio(false);
int m,n;
int a,b,c;
while(cin>>m>>n)
{memset(dp,0x3f,sizeof(dp));
for(int i=0;i<n;i++)
{cin>>a>>b>>c;
if(c<dp[a][b])
{dp[a][b]=c;
dp[b][a]=c;}
}
for(int i=0;i<m;i++)
dp[i][i]=0;
for(int k=0;k<m;k++)
{ for(int i=0;i<m;i++)
{ for(int j=0;j<m;j++)
dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);
}
}
cin>>a>>b;
if(dp[a][b]==0x3f3f3f3f) puts("-1");
else
cout<<dp[a][b]<<endl;}
return 0;
}