HDU 1874 图论模板复习
裸的最短路问题,复习一下图论的模板
http://acm.hdu.edu.cn/showproblem.php?pid=1874
SPFA 数组版本
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#define INF 99999999
using namespace std;
const int maxn = 222;
int mapp[maxn][maxn],n,m;
int vis[maxn], dis[maxn];
int SPFA(int st,int end){
for(int i=0;i<n;i++){ // 初始化
dis[i] = INF; vis[i] = 0;//G[i].clear();
}
queue<int>Q;
dis[st] = 0;
vis[st] = 1; //起始点距离为0, 标记上
Q.push(st);
while(!Q.empty()){
int vex = Q.front(); Q.pop();
vis[vex] = 0; //
for(int i=0;i<n;i++){
if( dis[i] > mapp[vex][i] + dis[vex]){
dis[i] = mapp[vex][i] + dis[vex];
if(!vis[i]){
vis[i] = 1;
Q.push(i);
}
}
}
}
return dis[end];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mapp[i][j] = INF;
int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c < mapp[a][b])
mapp[a][b] = mapp[b][a] = c;
}
int s,e;
scanf("%d%d",&s,&e);
int ans = SPFA(s,e);
if(ans < INF) printf("%d\n",ans);
else
printf("-1\n");
}
}
SPFA vector版本(邻接链表)
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#define INF 0xfffffff
using namespace std;
struct node{
int v,len;
node(int v = 0,int len=0):v(v),len(len){}
};
const int maxn = 222;
vector<node>G[maxn];
int dis[maxn];
int vis[maxn];
int n,m;
void init(){
for(int i=0;i<maxn;i++){
dis[i] = INF; vis[i] = 0;G[i].clear();
}
}
int SPFA(int st,int end){
vis[st] = 1; queue<int>Q;
dis[st] = 0;
Q.push(st);
while(!Q.empty()){
int vex = Q.front(); Q.pop();
vis[vex] = 0;
for(int i=0;i<G[vex].size();i++){
int v = G[vex][i].v;
if( dis[v] > G[vex][i].len + dis[vex] ){
dis[v] = G[vex][i].len + dis[vex];
if(!vis[v]){
vis[v] = 1;
Q.push(v);
}
}
}
}
return dis[end];
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init(); //
for(int i=0;i<m;i++){
int a,b,c; scanf("%d%d%d",&a,&b,&c);
G[a].push_back(node(b,c));
G[b].push_back(node(a,c));
}
int s,e; scanf("%d%d",&s,&e);
int ans = SPFA(s,e);
if(ans == INF) printf("-1\n");
else
printf("%d\n",ans);
}
}
Floyed
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#define INF 0xfffffff
using namespace std;
const int maxn = 222;
int n,m;
int map[maxn][maxn];
void floyed(){ //k ,i ,j
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i == j) map[i][j] = 0;
else map[i][j] = INF;
int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c < map[a][b]) //重边
map[a][b] = map[b][a] = c;
}
int s,e; scanf("%d%d",&s,&e);
floyed();
if(map[s][e] == INF)
printf("-1\n");
else
printf("%d\n",map[s][e]);
}
return 0;
}Dijkstra vector版本(邻接链表)
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#define INF 0xfffffff
using namespace std;
const int maxn = 222;
int n,m;
int map[maxn][maxn];
int dis[maxn];
bool vis[maxn];
struct node{
int v,len;
node(int v=0,int len=0):v(v),len(len){}
};
vector<node>G[maxn];
int dijkstra(int st,int end){
vis[st] = 1;
for(int i=0;i<G[st].size();i++){
int vex = G[st][i].v;
dis[vex] = min(dis[vex],G[st][i].len); // 消除重边
}
dis[st] = 0;
for(int num = 1;num<n;num++){ //找到其余的n-1个点
int tmp = INF, k;
for(int i=0;i<n;i++){ //找到 距离最近的一个节点
if(!vis[i] && tmp > dis[i] ){
tmp = dis[i];
k = i;
}
}
vis[k] = true;
if(tmp == INF) break;
for(int i=0;i<G[k].size();i++){
int vex = G[k][i].v;
if(!vis[vex] && dis[vex] > dis[k] + G[k][i].len ){
dis[vex] = dis[k] + G[k][i].len;
}
}
}
return dis[end];
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
G[i].clear();
vis[i] = 0; dis[i] = INF;
}
int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(node(b,c));
G[b].push_back(node(a,c));
}
int s,e; scanf("%d%d",&s,&e);
int ans = dijkstra(s,e);
if(ans == INF)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}Dijkstra 邻接矩阵
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#define INF 0xfffffff
using namespace std;
const int maxn = 222;
int n,m;
int map[maxn][maxn];
int dis[maxn];
bool vis[maxn];
int dijkstra(int st,int end){
memset(vis,0,sizeof(vis));
vis[st] = 1;
for(int i=0;i<n;i++){
dis[i] = map[st][i];
}
dis[st] = 0;
for(int num = 1;num<n;num++){ //找到其余的n-1个点
int tmp = INF, k;
for(int i=0;i<n;i++){
if(!vis[i] && tmp > dis[i]){
tmp = dis[i];
k = i;
}
}
vis[k] = true;
if(tmp == INF) break; // 当前没有找到最短的节点
for(int i=0;i<n;i++)
if(!vis[i] && dis[i] > dis[k] + map[k][i] )
dis[i] = dis[k] + map[k][i];
}
return dis[end];
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j] = (i == j)? 0:INF;
int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c< map[a][b])
map[a][b] = map[b][a] = c;
}
int s,e; scanf("%d%d",&s,&e);
int ans = dijkstra(s,e);
if(ans == INF)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号