spfa的時間複雜度是0(e)php
題目來源:http://acm.hdu.edu.cn/showproblem.php?pid=1874ios
#include <iostream>spa
using namespace std;3d
#include <vector>blog
#include<algorithm>隊列
#include<queue>ip
#include<string>ci
#include<map>string
#include<math.h>it
#include<iomanip>
#include<stack>
#include<string.h>
const int maxm=201;
const int INF=0X7FFFFFFF;
struct edge {
int to;
int val;
edge(int _to,int _val)
{
to=_to;
val=_val;
}
};
vector<vector<edge>> edges;
bool vis[maxm];
int dis[maxm];
int mymap[maxm][maxm];
int n,m;
void spfa(int s,int e)
{
queue<int> que;
que.push(s);
vis[s]=true;
dis[s]=0;
while(!que.empty())
{
int toptmp=que.front();
que.pop();
for(int i=0;i<edges[toptmp].size();i++)
{
if(dis[edges[toptmp][i].to]>dis[toptmp]+edges[toptmp][i].val)
{
dis[edges[toptmp][i].to]=dis[toptmp]+edges[toptmp][i].val;
if(!vis[edges[toptmp][i].to])
{
vis[edges[toptmp][i].to]=true;
que.push(edges[toptmp][i].to);
}
}
}
vis[toptmp]=false;
}
if(dis[e]==INF)
cout<<"-1"<<endl;
else
cout<<dis[e]<<endl;
}
int main()
{
while (cin>>n>>m) {
edges.clear();
edges.resize(n+1);
for(int i=0;i<n;i++)
{
dis[i]=INF;
vis[i]=false;
}
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
bool flag1=true,flag2=true;
for(int j=0;j<edges[x].size();j++)
{
if(edges[x][j].to==y)
{
if(edges[x][j].val>z)
edges[x][j].val=z;
flag1=false;
}
}
if(flag1)
edges[x].push_back(edge(y,z));
for(int j=0;j<edges[y].size();j++)
{
if(edges[y][j].to==x)
{
if(edges[y][j].val>z)
edges[y][j].val=z;
flag2=false;
}
}
if(flag2)
edges[y].push_back(edge(x,z));
}
int s,e;
cin>>s>>e;
spfa(s,e);
}
return 0;
}
/*
3 4
0 1 1
0 2 3
0 2 2
1 2 1
0 2
3 1
0 1 1
1 1
3 4
1 0 3
0 1 1
0 2 3
1 2 1
0 2
2
-1
*/
dijikstra +優先隊列 o(vlogv)
#include <iostream> using namespace std; #include <vector> #include<algorithm> #include<queue> #include<string> #include<map> #include<math.h> #include<iomanip> #include<stack> #include<string.h> const int maxm=201; const int INF=0X7FFFFFFF; struct edge { int to; int val; edge(int _to,int _val) { to=_to; val=_val; } }; struct cmp{ bool operator()(edge a,edge b) { return a.val>b.val; } }; vector<vector<edge>> edges; bool vis[maxm]; int dis[maxm]; int mymap[maxm][maxm]; int n,m; void dijkstrapriority(int s,int e) { for(int i=0;i<n;i++) { vis[i]=false; dis[i]=INF; } priority_queue<edge,vector<edge>,cmp> myque; vis[s]=true; dis[s]=0; for(int i=0;i<edges[s].size();i++) { myque.push(edge(edges[s][i].to,edges[s][i].val)); dis[edges[s][i].to]=edges[s][i].val; } while (!myque.empty()) { edge toptmp=myque.top(); myque.pop(); if(vis[toptmp.to]) continue; vis[toptmp.to]=true; for(int i=0;i<edges[toptmp.to].size();i++) { int t=edges[toptmp.to][i].to; if(!vis[t]&&dis[t]>dis[toptmp.to]+edges[toptmp.to][i].val) { dis[t]=dis[toptmp.to]+edges[toptmp.to][i].val; myque.push(edge(t,dis[t])); } } } if(dis[e]==INF) cout<<"-1"<<endl; else cout<<dis[e]<<endl; } int main() { while (cin>>n>>m) { edges.clear(); edges.resize(n+1); for(int i=0;i<n;i++) { dis[i]=INF; vis[i]=false; } for(int i=0;i<m;i++) { int x,y,z; cin>>x>>y>>z; bool flag1=true,flag2=true; for(int j=0;j<edges[x].size();j++) { if(edges[x][j].to==y) { if(edges[x][j].val>z) edges[x][j].val=z; flag1=false; } } if(flag1) edges[x].push_back(edge(y,z)); for(int j=0;j<edges[y].size();j++) { if(edges[y][j].to==x) { if(edges[y][j].val>z) edges[y][j].val=z; flag2=false; } } if(flag2) edges[y].push_back(edge(x,z)); } int s,e; cin>>s>>e; //spfa(s,e); dijkstrapriority(s,e); } return 0; } /* 3 4 0 1 1 0 2 3 0 2 2 1 2 1 0 2 3 1 0 1 1 1 1 3 4 1 0 3 0 1 1 0 2 3 1 2 1 0 2 2 -1 */