码迷,mamicode.com
首页 > 其他好文 > 详细

lightoj1074 最短路

时间:2015-09-06 22:53:21      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

题意:有n个城市,每个城市有拥挤值,有一些单向道路,从某个城市到另一个城市的花费是拥挤值差的三次方,当然可能是负的值。问从1点到某点最少的花费,若小于3或不能到达输出“?”

建图的边权是拥挤值差的三次方,跑一遍最短路然后按照询问输出就可以了。

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 
 6 int head[205],point[40005],val[40005],next[40005],size;
 7 int dist[205],l[205],t,s[205],n;
 8 bool vis[205],cir[205];
 9 
10 void add(int a,int b,int v){
11     point[size]=b;
12     val[size]=v;
13     next[size]=head[a];
14     head[a]=size++;
15 }
16 
17 void spfa(){
18     int i;
19     memset(dist,-1,sizeof(dist));
20     memset(vis,0,sizeof(vis));
21     memset(s,0,sizeof(s));
22     memset(cir,0,sizeof(cir));
23     dist[1]=0;
24     queue<int>q;
25     q.push(1);
26     vis[1]=1;
27     while(!q.empty()){
28         int u=q.front();
29         q.pop();
30         vis[u]=0;
31         if(s[u]>n){
32             cir[u]=1;
33             continue;
34         }
35         for(i=head[u];~i;i=next[i]){
36             int j=point[i];
37             if((dist[j]==-1||dist[j]>dist[u]+val[i])&&!cir[j]){
38                 dist[j]=dist[u]+val[i];
39                 if(!vis[j]){
40                     q.push(j);
41                     vis[j]=1;
42                     s[j]++;
43                 }
44             }
45         }
46     }
47     int m;
48     scanf("%d",&m);
49     for(i=1;i<=m;i++){
50         scanf("%d",&t);
51         if(!cir[t]&&dist[t]>=3)printf("%d\n",dist[t]);
52         else printf("?\n");
53     }
54 }
55 
56 int main(){
57     int T;
58     while(scanf("%d",&T)!=EOF){
59         for(int q=1;q<=T;q++){
60             scanf("%d",&n);
61             int i;
62             for(i=1;i<=n;i++){
63                 scanf("%d",&l[i]);
64             }
65             memset(head,-1,sizeof(head));
66             size=0;
67             int m;
68             scanf("%d",&m);
69             for(i=1;i<=m;i++){
70                 int a,b;
71                 scanf("%d%d",&a,&b);
72                 int v=l[b]-l[a];
73                 v=v*v*v;
74                 add(a,b,v);
75             }
76             printf("Case %d:\n",q);
77             spfa();
78         }
79     }
80     return 0;
81 }
View Code

 

lightoj1074 最短路

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4787454.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!