zoukankan      html  css  js  c++  java
  • 1934. Black Spot(spfa)

    1934

    水题 RE了N久  后来发现是无向图

      1 #include <iostream>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<stdlib.h>
      5 #include<vector>
      6 #include<cstdio>
      7 #include<queue>
      8 using namespace std;
      9 #define N 2000010
     10 #define INF 0xfffffff
     11 struct node
     12 {
     13     int u,v,next;
     14     double w;
     15 }ed[N<<1];
     16 int t,head[N],vis[N],dis[N],pa[N],o[N];
     17 double p[N];
     18 int n,m;
     19 void init()
     20 {
     21     t = 0;
     22     memset(head,-1,sizeof(head));
     23 }
     24 void add(int u,int v,int w)
     25 {
     26     ed[t].u = u;
     27     ed[t].v = v;
     28     ed[t].w = w;
     29     ed[t].next = head[u];
     30     head[u] = t++;
     31 }
     32 void spfa(int s,int e)
     33 {
     34     memset(vis,0,sizeof(vis));
     35     int i;
     36     for(i = 1; i <= n ; i++)
     37     {
     38         dis[i] = INF;
     39         p[i] = 0;
     40     }
     41     queue<int>q;
     42     dis[s] = 1;
     43     p[s] = 1;
     44     q.push(s);
     45     while(!q.empty())
     46     {
     47         int u = q.front();
     48         q.pop();
     49         vis[u] = 0;
     50         for(i = head[u] ; i != -1 ; i = ed[i].next)
     51         {
     52             int v = ed[i].v;
     53             double w = ed[i].w;
     54             if(dis[v]>=dis[u]+1)
     55             {
     56                 if(dis[v]==dis[u]+1)
     57                 {
     58                     if(p[v]<p[u]*w/100.0)
     59                     {
     60                         p[v] = p[u]*w/100.0;
     61                         pa[v] = u;
     62                     }
     63                 }
     64                 else
     65                 {
     66                     dis[v] = dis[u]+1;
     67                     p[v] = p[u]*w/100.0;
     68                     pa[v] = u;
     69                 }
     70                 if(!vis[v])
     71                 {
     72                     vis[v] = 1;
     73                     q.push(v);
     74                 }
     75             }
     76         }
     77     }
     78     printf("%d %lf
    ",dis[e],1-p[e]);
     79     int x = pa[e],g=1;
     80     o[g] = e;
     81     while(x!=s)
     82     {
     83         g++;
     84         o[g] = x;
     85         x = pa[x];
     86     }
     87     g++;
     88     o[g] = s;
     89     for(i = g ; i > 1; i--)
     90     printf("%d ",o[i]);
     91     printf("%d
    ",o[1]);
     92 }
     93 int main()
     94 {
     95     int i;init();
     96     int a,b;
     97     scanf("%d%d",&n,&m);
     98     scanf("%d%d",&a,&b);
     99     for(i = 1; i <= m ; i++)
    100     {
    101         int u,v;
    102         double w;
    103         scanf("%d%d%lf",&u,&v,&w);
    104         add(u,v,100-w);
    105         add(v,u,100-w);
    106     }
    107     spfa(a,b);
    108     return 0;
    109 }
    View Code
  • 相关阅读:
    SSM中(Spring-SpringMVC-Mybatis)(一:概念)
    java中的==和equals()
    JAVA之二叉查找树
    Java中堆与栈
    java的运行机制(基础)
    覆盖(重写),重构,重载的区别
    JAVA多线程基础
    java中的类修饰符、成员变量修饰符、方法修饰符
    JAVA中的流程控制语句
    JAVA中的构造函数
  • 原文地址:https://www.cnblogs.com/shangyu/p/3364357.html
Copyright © 2011-2022 走看看