您的位置:首页 > 其它

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

2014-04-07 22:57 429 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: