算法提高 道路和航路
时间限制:1.0s 内存限制:256.0MB
锦囊1
锦囊2
锦囊3
问题描述
农夫约翰正在针对一个新区域的牛奶配送合同进行研究。他打算分发牛奶到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
样例输出
NO PATH 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。
521961 | 609738062@qq.com | 04-09 10:53 | 1.248KB | C++ | 运行超时 | 90 | 运行超时 | 5.187MB |
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 #define ll long long11 12 const int N = 25005;13 const ll inf = 0x3f3f3f3f;14 int n,r,p,s;15 ll v[N];16 typedef struct17 {18 ll cost;19 int to;20 }PP;21 22 vector G[N];23 int vis[N];24 25 void bellman()26 {27 memset(vis,0,sizeof(vis));28 fill(v,v+1+n,inf);29 v[s]=0;30 queue que;31 que.push(s);32 vis[s]=1;33 int i;34 int to;35 ll cost;36 while(que.size()>=1)37 {38 int te=que.front();39 que.pop();40 for(i=0;i v[te]+cost){ 44 v[to]=v[te]+cost;45 if(vis[to]==0){46 vis[to]=1;47 que.push(to);48 } 49 }50 }51 vis[te]=0;52 }53 }54 55 int main()56 {57 int i;58 //freopen("data.in","r",stdin);59 scanf("%d%d%d%d",&n,&r,&p,&s);60 for(i=0;i<=n;i++){61 G[i].clear();62 }63 PP te;64 int uu,vv;65 ll cost;66 for(i=1;i<=r;i++){67 scanf("%d%d%I64d",&uu,&vv,&cost);68 te.cost=cost;69 te.to=vv;70 G[uu].push_back(te);71 te.to=uu;72 G[vv].push_back(te);73 }74 for(i=1;i<=p;i++){75 scanf("%d%d%I64d",&uu,&vv,&cost);76 te.cost=cost;77 te.to=vv;78 G[uu].push_back(te);79 }80 bellman();81 for(i=1;i<=n;i++){82 if(v[i]==inf){83 printf("NO PATH\n");84 }85 else{86 printf("%I64d\n",v[i]);87 }88 }89 return 0;90 }