题目:http://poj.org/problem?id=1511
题意:求从源点到每个点,再从每个点到源点的最短距离之和
题解:spfa算法+邻接表存储
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#define N 1000050
#define MAX 0xFFFFFFFFFF
using namespace std;
typedef struct
{
int s,e,w,next;
}Edge;
Edge e[2][N];
int head[2][N];
long long dis[N];
bool vis[N];
long long sum;
void spfa(int p,int start,int v)
{
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(start);
for(int i=1;i<=v;i++)
{
if(i!=start) dis[i]=MAX;
else dis[i]=0;
}
while(!q.empty())
{
int pos=q.front();q.pop();
int d=head[p][pos];
while(d!=-1)
{
if(e[p][d].w+dis[e[p][d].s]<dis[e[p][d].e])
{
dis[e[p][d].e]=e[p][d].w+dis[e[p][d].s];
if(!vis[e[p][d].e]) {q.push(e[p][d].e);vis[e[p][d].e]=1;}
}
d=e[p][d].next;
}
vis[pos]=0;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
memset(head,-1,sizeof(head));
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&e[0][i].s,&e[0][i].e,&e[0][i].w);
e[0][i].next=head[0][e[0][i].s];
head[0][e[0][i].s]=i;
e[1][i].e=e[0][i].s;e[1][i].s=e[0][i].e;e[1][i].w=e[0][i].w;
e[1][i].next=head[1][e[1][i].s];
head[1][e[1][i].s]=i;
}
sum=0;
spfa(0,1,n);
for(int i=2;i<=n;i++) sum+=dis[i];
spfa(1,1,n);
for(int i=2;i<=n;i++) sum+=dis[i];
printf("%lld\n",sum);
}
}
dijkstra算法(o(mlogn))(不针对此题)
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define N 250
#define M 1050
#define INF 9999999
using namespace std;
typedef struct
{
int s,e,w;
}Edge;
Edge e[M];
vector<int> v[N];//邻接表存储
int dist[N];
bool vis[N];
struct Heap
{
int d,u;
bool operator < (const Heap &s) const //用优先队列必须定义这个
{
return d > s.d;
}
};
void dijkstra(int s,int n)
{
priority_queue<Heap> q;
for(int i=0;i<n;i++) dist[i]=INF;
dist[s]=0;
memset(vis,0,sizeof(vis));
q.push((Heap){0,s});
while(!q.empty())
{
Heap h=q.top();q.pop();
int u=h.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<v[u].size();i++)
{
Edge bian=e[v[u][i]];
if(dist[bian.e]>dist[u]+bian.w)
{
dist[bian.e]=dist[u]+bian.w;q.push((Heap){dist[bian.e],bian.e});
}
}
}
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&e[i].s,&e[i].e,&e[i].w);
v[e[i].s].push_back(i);
v[e[i].e].push_back(i);
}
int s,e;
scanf("%d %d",&s,&e);
dijkstra(s,n);
if(dist[e]>=INF) printf("-1\n");
else printf("%d\n",dist[e]);
for(int i=0;i<n;i++) v[i].clear();
}
return 0;
}