zoukankan      html  css  js  c++  java
  • lightoj1074 最短路

    题意:有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
    ",dist[t]);
    52         else printf("?
    ");
    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:
    ",q);
    77             spfa();
    78         }
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分
    1025 反转链表 (25 分
    1024 科学计数法 (20 分
    1023 组个最小数 (20 分)
    将命令的输出保存到文件
    使用与管理控制台历史
    度量命令执行时间
    检查最后运行命令的状态
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4787454.html
Copyright © 2011-2022 走看看