问题描述:参考hud3790
就只是一般的dij加几行代码。
其中注意更新最小花费应该是在路程相同时更新,初始化好一般没什么问题。
AC代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <vector>
#include <cstdlib>
using namespace std;
const int maxn=1000+10;
const int inf=0x3f3f3f3f*2;
struct qnode{
int v;
int dis;
int cost;
qnode(int a,int b,int c){
v=a,dis=b,cost=c;
}
};
struct node{
int v;
int len;
bool operator <(node a)const{
return len>a.len;
}
node(int a,int b){
v=a,len=b;
}
};
vector<qnode>E[maxn];
priority_queue<node>q;
int dis[maxn];
int cost[maxn];
int vis[maxn];
void dij(int s,int e){
dis[s]=0;
cost[s]=0;
q.push(node(s,0));
while(!q.empty()){
node v1=q.top();
q.pop();
int u=v1.v;
if(vis[u])continue;
int len=E[u].size();
for(int i=0;i<len;i++){
int v2=E[u][i].v;
if(vis[v2])continue;
int tempdis=E[u][i].dis;
int tempcost=E[u][i].cost;
if(dis[v2]>dis[u]+tempdis){
dis[v2]=dis[u]+tempdis;
cost[v2]=cost[u]+tempcost;
q.push(node(v2,dis[v2]));
}
else if(dis[v2]==dis[u]+tempdis){
cost[v2]=min(cost[v2],cost[u]+tempcost);
}
}
}
}
int main()
{
int n,m,s,e,a,b,c,d;
while(scanf(“%d %d”,&n,&m)){
if(n==0&&m==0)break;
while(!q.empty())q.pop();
for(int i=0;i<=n;i++)
{
dis[i]=inf;
cost[i]=inf;
E[i].clear();
}
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++){
scanf(“%d%d%d%d”,&a,&b,&c,&d);
E[a].push_back(qnode(b,c,d));
E[b].push_back(qnode(a,c,d));
}
scanf(“%d %d”,&s,&e);
dij(s,e);
printf(“%d %d\n”,dis[e],cost[e]);
}
return 0;
}