代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
#define inf 0x3f3f3f3f
const int maxn=100+5;
vector< pair<int,int> > edges[maxn];
int dist[maxn];
int vis[maxn];
int p[maxn];
void init()
{
for(int i=0;i<maxn;++i)
{
dist[i]=inf;
edges[i].clear();
}
memset(vis,0,sizeof(vis));
}
void spfa(int s)
{
queue<int>q;
dist[s]=0;
q.push(s);
vis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<edges[u].size();++i)
{
int v=edges[u][i].first;
if(dist[v]>dist[u]+edges[u][i].second)
{
dist[v]=dist[u]+edges[u][i].second;
p[v]=u;//记录路径
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
}
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0) break;
init();
for(int i=0;i<m;++i)
{
int a,b,c;
cin>>a>>b>>c;
edges[a].push_back(make_pair(b,c));
edges[b].push_back(make_pair(a,c));
}
spfa(1);
cout<<dist[n]<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1005;
#define inf 0x3f3f3f3f
int dist[maxn],cost[maxn];
int vis[maxn];
struct node{
int a,b,d,p;
};
vector<node>edges[maxn];
void init()
{
for(int i=0;i<maxn;++i)
{
edges[i].clear();
dist[i]=inf;
cost[i]=inf;
vis[i]=0;
}
}
void spfa(int s)
{
priority_queue<int>q;
q.push(s);
vis[s]=1;
dist[s]=0;
cost[s]=0;
while(!q.empty())
{
int u=q.top();
q.pop();
vis[u]=0;
for(int i=0;i<edges[u].size();++i)
{
int v=edges[u][i].b;
if(dist[v]>dist[u]+edges[u][i].d)
{
dist[v]=dist[u]+edges[u][i].d;
cost[v]=cost[u]+edges[u][i].p;
if(vis[v]==0)
{
vis[v]=1;
q.push(v);
}
}
else if(dist[v]==dist[u]+edges[u][i].d)
{
if(cost[v]>cost[u]+edges[u][i].p)
{
cost[v]=cost[u]+edges[u][i].p;
}
}
}
}
}
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0) break;
init();
for(int i=0;i<m;++i)
{
node now;
cin>>now.a>>now.b>>now.d>>now.p;
edges[now.a].push_back(now);
edges[now.b].push_back(now);
}
int s,t;
cin>>s>>t;
spfa(s);
cout<<dist[t]<<" "<<cost[t]<<endl;
}
return 0;
}