http://acm.hdu.edu.cn/showproblem.php?pid=3790
链式前向星 不用判重边,dijkstra要判重边
#include<bits/stdc++.h>
#define INF 1<<30
using namespace std;
int n,m,cnt;
const int N=1005;
int vis[N],dis[N],head[N],mon[N];
struct node{
int v,c,d,next;
}e[100005];
void add(int u,int v,int d,int c)
{
e[cnt].v=v;
e[cnt].c=c;
e[cnt].d=d;
e[cnt].next=head[u];
head[u]=cnt++;
}
queue<int>q;
void init()
{
cnt=0;
for(int i=1;i<=n;i++){
dis[i]=INF;
vis[i]=0;
mon[i]=INF;
}
memset(head,-1,sizeof(head));
while(!q.empty())q.pop();
}
void spfa(int s)
{
dis[s]=0;vis[s]=1;mon[s]=0;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].d){
dis[v]=dis[u]+e[i].d;
mon[v]=mon[u]+e[i].c;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
else if(dis[v]==dis[u]+e[i].d){
//dis[v]=dis[u]+e[i].d;
mon[v]=min(mon[v],mon[u]+e[i].c);
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0||m==0)return 0;
init();
for(int i=1;i<=m;i++){
int u,v,d,c;
scanf("%d %d %d %d",&u,&v,&d,&c);
add(u,v,d,c);
add(v,u,d,c);
}
int s,t;
cin>>s>>t;
spfa(s);
printf("%d %d\n",dis[t],mon[t]);
}
}