3 2 1 2 5 6 2 3 4 5 1 3 0 0
#include<cstdio>
#include<vector>
#include<queue>
#define MAX 1010
#define INF 0x0FFFFFFF
using namespace std;
typedef struct Node
{
int adjvertex;
int len;
int cost;
}Node;
int visited[MAX];
int distances[MAX];
int costs[MAX];
vector<Node> map[MAX];
void SPFA(int start,int n)
{
int i,j;
queue<int> q;
q.push(start);
for(i=1;i<=n;i++)
{
distances[i]=costs[i]=INF;
visited[i]=0;
}
distances[start]=costs[start]=0;
while(!q.empty())
{
int index;
index=q.front();
q.pop();
visited[index]=1;
for(i=0;i<map[index].size();i++)
{
int t=map[index][i].adjvertex;
int dis=map[index][i].len;
int cost=map[index][i].cost;
if(distances[t]==INF||distances[t]>distances[index]+dis)
{
distances[t]=distances[index]+dis;
costs[t]=costs[index]+cost;
if(!visited[t])
{
q.push(t);
visited[t]=1;//剪枝作用
}
}
else if(distances[t]==distances[index]+dis)
{
if(costs[t]>costs[index]+cost)
{
costs[t]=costs[index]+cost;
if(!visited[t])
{
q.push(t);
visited[t]=1;
}
}
}
}
}
}
int main(int argc,char *argv[])
{
int i,n,m;
int start,end;
while(scanf("%d%d",&n,&m)&&n&&m)
{
for(i=0;i<MAX;i++)
map[i].clear();
for(i=0;i<m;i++)
{
Node p,q;
int index;
scanf("%d",&index);
scanf("%d%d%d",&(p.adjvertex),&(p.len),&(p.cost));
map[index].push_back(p);
q.adjvertex=index;
q.len=p.len;
q.cost=p.cost;
map[p.adjvertex].push_back(q);
}
scanf("%d%d",&start,&end);
SPFA(start,n);
printf("%d %d\n",distances[end],costs[end]);
}
return 0;
}
Dijkstra算法也可以解决:#include<cstdio>
#include<vector>
#define MAX 1010
#define INF 0x0FFFFFFF
using namespace std;
typedef struct Node
{
int adjvertex;
int len;
int cost;
}Node;
int visited[MAX];
int distances[MAX];
int costs[MAX];
vector<Node> map[MAX];
void Dijkstra(int start,int n)
{
int i,j,k,t;
int dis,cost;
int min=INF,t_cost;
for(i=1;i<=n;i++)
{
distances[i]=INF;
costs[i]=0;
visited[i]=0;
}
for(i=0;i<map[start].size();i++)
{
int index;
index=map[start][i].adjvertex;
distances[index]=map[start][i].len;
costs[index]=map[start][i].cost;
}
distances[start]=0;
visited[start]=1;
for(i=1;i<n;i++)
{
min=INF;
for(j=1;j<=n;j++)
{
if(!visited[j]&&distances[j]<min)
{
k=j;
min=distances[j];
t_cost=costs[j];
}
}
visited[k]=1;
for(j=1;j<=n;j++)
{
for(t=0;t<map[k].size();t++)
{
if(map[k][t].adjvertex!=j)
continue;
else
break;
}
if(t!=map[k].size())
{
dis=map[k][t].len;
cost=map[k][t].cost;
}
else
{
dis=INF;
cost=INF;
}
if(!visited[j]&&distances[j]>dis+min)
{
distances[j]=dis+min;
costs[j]=t_cost+cost;
}
else if(!visited[j]&&distances[j]==dis+min&&costs[j]>cost+t_cost)
{
distances[j]=dis+min;
costs[j]=t_cost+cost;
}
}
}
}
int main(int argc,char *argv[])
{
int i,n,m;
int start,end;
while(scanf("%d%d",&n,&m)&&n&&m)
{
for(i=0;i<MAX;i++)
map[i].clear();
for(i=0;i<m;i++)
{
Node p,q;
int index;
scanf("%d",&index);
scanf("%d%d%d",&(p.adjvertex),&(p.len),&(p.cost));
map[index].push_back(p);
q.adjvertex=index;
q.len=p.len;
q.cost=p.cost;
map[p.adjvertex].push_back(q);
}
scanf("%d%d",&start,&end);
Dijkstra(start,n);
printf("%d %d\n",distances[end],costs[end]);
}
return 0;
}
用二维数组解决Dijkstra问题会比较方便,用STL使程序看起来略显繁琐,算了,不想再优化了,就这样吧。。。原文:http://blog.csdn.net/cstopcoder/article/details/19625455