蓝桥杯(道路与航路)
算法提高 道路和航路
时间限制:1.0s 内存限制:256.0MB
问题描述
农夫约翰正在针对一个新区域的牛奶配送合同进行研究。他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连。
每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci。每一条公路,Ci的范围为0<=Ci<=10,000;由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000<=Ci<=10,000。
每一条公路都是双向的,正向和反向的花费是一样的,都是非负的。
每一条航路都根据输入的Ai和Bi进行从Ai->Bi的单向通行。实际上,如果现在有一条航路是从Ai到Bi的话,那么意味着肯定没有通行方案从Bi回到Ai。
农夫约翰想把他那优良的牛奶从配送中心送到各个城镇,当然希望代价越小越好,你可以帮助他嘛?配送中心位于城镇S中(1<=S<=T)。
输入格式
输入的第一行包含四个用空格隔开的整数T,R,P,S。
接下来R行,描述公路信息,每行包含三个整数,分别表示Ai,Bi和Ci。
接下来P行,描述航路信息,每行包含三个整数,分别表示Ai,Bi和Ci。
输出格式
输出T行,分别表示从城镇S到每个城市的最小花费,如果到不了的话输出NO PATH。
样例输入
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
样例输出
NO PATH
NO PATH
5
0
-95
-100
NO PATH
5
0
-95
-100
数据规模与约定
对于20%的数据,T<=100,R<=500,P<=500;
对于30%的数据,R<=1000,R<=10000,P<=3000;
对于100%的数据,1<=T<=25000,1<=R<=50000,1<=P<=50000。
ford 85分,3个测试数据超时
#include"cstdio" using namespace std; const int MAXN=150005; const int INF=0x3fffffff; int T,R,P,S; int E; struct Edge{ int from,to,cost; }es[MAXN]; int d[MAXN]; void ford() { for(int i=0;i<=T;i++) d[i]=INF; d[S]=0; while(true) { bool update=false; for(int i=0;i<E;i++) { Edge e=es[i]; if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost) { d[e.to]=d[e.from]+e.cost; update=true; } } if(!update) break; } } int main() { scanf("%d%d%d%d",&T,&R,&P,&S); for(int i=0;i<R;i++) { int from,to,cost; scanf("%d%d%d",&from,&to,&cost); es[E].from=from,es[E].to=to,es[E++].cost=cost; es[E].from=to,es[E].to=from,es[E++].cost=cost; } for(int i=0;i<P;i++) { int from,to,cost; scanf("%d%d%d",&from,&to,&cost); es[E].from=from,es[E].to=to,es[E++].cost=cost; } ford(); for(int i=1;i<=T;i++) { if(d[i]>=INF) printf("NO PATH\n"); else printf("%d\n",d[i]); } return 0; }
编译信息 |
无
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
详细记录 |
|
#include"cstdio" #include"vector" #include"queue" using namespace std; const int MAXN=25005; const int INF=0X3fffffff; typedef pair<int,int> P; int T,R,p,S; vector<P> G[MAXN]; int d[MAXN]; int vis[MAXN]; void spfa(int s) { for(int i=1;i<=T;i++) d[i]=INF; queue<int> que; d[s]=0,vis[s]=1,que.push(s); while(!que.empty()) { int v=que.front();que.pop(); vis[v]=0; for(int i=0;i<G[v].size();i++) { P e=G[v][i]; if(d[e.second]>d[v]+e.first) { d[e.second]=d[v]+e.first; if(!vis[e.second]) { vis[e.second]=1; que.push(e.second); } } } } } int main() { scanf("%d%d%d%d",&T,&R,&p,&S); for(int i=0;i<R;i++) { int u,v,t; scanf("%d%d%d",&u,&v,&t); G[u].push_back(P(t,v)); G[v].push_back(P(t,u)); } for(int i=0;i<p;i++) { int u,v,t; scanf("%d%d%d",&u,&v,&t); G[u].push_back(P(t,v)); } spfa(S); for(int i=1;i<=T;i++) { if(d[i]>=INF) printf("NO PATH\n"); else printf("%d\n",d[i]); } return 0; }
详细记录 |
|
spfa比ford 快一点。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步