HDOJ 3790
#include <iostream> #include <stdio.h> using namespace std; typedef struct Road{ int d; int p; }Road; Road road[1005][1005]; #define INF 0xfffffff int n,m; void dij(int s,int t) { bool visited[1005]; int dis[1005]; int price[1005]; for(int i=1;i<=n;i++) { visited[i]=false; dis[i]=road[s][i].d; price[i]=road[s][i].p; } visited[s]=true; dis[s]=0; price[s]=0; for(i=1;i<n;i++) { int min=INF; int node=0; for(int j=1;j<=n;j++) { if(!visited[j]&&dis[j]<min) { min=dis[j]; node=j; } } visited[node]=true; for(j=1;j<=n;j++) { if(!visited[j]&&dis[j]>min+road[node][j].d) { dis[j]=min+road[node][j].d; price[j]=price[node]+road[node][j].p; } else if(!visited[j]&&dis[j]==min+road[node][j].d) { if(price[j]>price[node]+road[node][j].p) price[j]=price[node]+road[node][j].p; } } } printf("%d %d\n",dis[t],price[t]); } int main() { while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; int i; for(i=1;i<=n;i++) for(int j=1;j<=n;j++) { road[i][j].d=INF; road[i][j].p=INF; } for(i=1;i<=m;i++) { int temp1,temp2,temp3,temp4; scanf("%d%d%d%d",&temp1,&temp2,&temp3,&temp4); // cin>>temp1>>temp2>>temp3>>temp4; if(road[temp1][temp2].d>temp3) { road[temp1][temp2].d=road[temp2][temp1].d=temp3; road[temp1][temp2].p=road[temp2][temp1].p=temp4; } else if(road[temp1][temp2].d==temp3) { if(road[temp1][temp2].p>temp4) road[temp1][temp2].p=road[temp2][temp1].p=temp4; } }//input is over int s,t; scanf("%d%d",&s,&t); //cin>>s>>t; dij(s,t); } return 0; }