poj 3268 spfa 和dijkstra堆优化 +矩阵逆转。

来源:互联网 发布:sybase数据库厂家 编辑:程序博客网 时间:2024/04/30 13:07

ps 这道题用floyd准超时。

所以只能用spfa或者dijkstra堆优化

spfa代码:

#include <iostream>#include<queue>#include <vector>using namespace std;struct edge{int from,to,cost;}e[110000];vector<edge>map[1100];int d[1100],ans[1100];int n,m,x;void spfa(int x){bool used[1100]={0};fill(d,d+n+2,321321321);queue<int>que;d[x]=0;used[x]=1;que.push(x);while(!que.empty()){int id=que.front();used[id]=0;for(int i=0;i<map[id].size();i++){edge t=map[id][i];if(d[t.to]>d[id]+t.cost){d[t.to]=d[id]+t.cost;if(!used[t.to]){used[t.to]=1;que.push(t.to);}}}que.pop();}}int main(){cin>>n>>m>>x;for(int i=1;i<=m;i++){cin>>e[i].from>>e[i].to>>e[i].cost;map[e[i].from].push_back(e[i]);}spfa(x);for(int i=1;i<=n;i++){ans[i]=d[i];map[i].clear();}for(int i=1;i<=m;i++){swap(e[i].from,e[i].to);map[e[i].from].push_back(e[i]);}spfa(x);int maxn=0;for(int i=1;i<=n;i++){ans[i]+=d[i];maxn=ans[i]>maxn?ans[i]:maxn;}cout<<maxn<<endl;return 0;}


dijkstra堆优化 代码:

#include <iostream>#include <queue>#include <vector>#include <functional>using namespace std;struct edge{int from,to,cost;};vector <edge> map[1100];typedef pair<int,int>P;int n,m,x;int d[1100],ans[1100];edge e[110000];void dijkstra(int a){for(int i=1;i<=n;i++)d[i]=100000000;d[a]=0;priority_queue<P,vector<P>,greater<P> >que;que.push(P(0,a));while(!que.empty()){    P p=que.top();que.pop();int v=p.second;if(d[v]<p.first)continue;for(int i=0;i<map[v].size();i++){edge e=map[v][i];if(d[e.to]>d[v]+e.cost){d[e.to]=d[v]+e.cost;que.push(P(d[e.to],e.to));}}}}int main(){cin>>n>>m>>x;for(int i=1;i<=m;i++){cin>>e[i].from>>e[i].to>>e[i].cost;map[e[i].from].push_back(e[i]);}dijkstra(x);for(int i=1;i<=n;i++){ans[i]=d[i];map[i].clear();}for(int i=1;i<=m;i++){swap(e[i].from,e[i].to);map[e[i].from].push_back(e[i]);}dijkstra(x);int maxn=0;for(int i=1;i<=n;i++){ans[i]+=d[i];maxn=ans[i]>maxn?ans[i]:maxn;}cout<<maxn<<endl;return 0;}



0 0