http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5718
题目大意: n个点 m条边 每条边有一个时间和花费 0点是起始点 从0点到各个点 的最短时间 时间相同的最小花费
还是做题少 到这种题 自己真的是一点思路都没
用SPFA就可以
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #include<queue> #include<vector> #include<algorithm> #include<iostream> using namespace std; #define N 500050 const double ESP = 1e-8; const long long INF = (1ll<<60)-1; #define memset(a,b) memset(a,b,sizeof(a)) struct node { int v; long long cost,time; node(int v0=0, long long c=0, long long t=0) : v(v0),cost(c), time(t){} }; vector<vector<node> >G; int vis[N]; long long Time[N],Cost[N]; int n,m; void SPFA() { memset(vis,0); for(int i=0;i<n;i++) { Time[i]=Cost[i]=INF; } Time[0]=Cost[0]=0; queue<int>Q; Q.push(0); while(!Q.empty()) { int q=Q.front(); Q.pop(); vis[q]=0;///这个忘了写wa到哭 int len=G[q].size(); for(int i=0;i<len;i++) { node p=G[q][i]; if(Time[p.v]>Time[q]+p.time || (Time[p.v]==Time[q]+p.time && Cost[p.v]>p.cost)) { Time[p.v]=Time[q]+p.time; Cost[p.v]=p.cost; if(!vis[p.v]) { vis[p.v]=1; Q.push(p.v); } } } } long long int aa,bb; aa=bb=0; for(int i=1;i<n;i++) { aa+=Time[i]; bb+=Cost[i]; } printf("%lld %lld ",aa,bb); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); G.clear(); G.resize(n+2); for(int i=0;i<m;i++) { int u,v; long long int time,cost; scanf("%d %d %lld %lld",&u,&v,&time,&cost); G[u].push_back(node(v,cost,time)); G[v].push_back(node(u,cost,time)); } SPFA(); } return 0; }