90分 蓝桥杯 算法提高 道路和航路 [ 最短路 ]

传送门

  算法提高 道路和航路  
时间限制: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
样例输出
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 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <vector>
 7 #include <queue>
 8 using namespace std;
 9 
10 #define ll long long
11 
12 const int N = 25005;
13 const ll inf = 0x3f3f3f3f;
14 int n,r,p,s;
15 ll v[N];
16 typedef struct
17 {
18     ll cost;
19     int to;
20 }PP;
21 
22 vector<PP> 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<int> 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<G[te].size();i++){
41             to=G[te][i].to;
42             cost=G[te][i].cost;
43             if(v[to]>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 }

 

posted on 2015-04-09 11:11  njczy2010  阅读(528)  评论(0编辑  收藏  举报