zoukankan      html  css  js  c++  java
  • poj1122 FDNY to the Rescue! 最短路

      这道题是最短路问题,开始卡了好久后来才发现是因为i,j坐标输入有问题。我更改了i,j坐标顺序才发现正确结果,坑啊!

      不过别的就是个裸地最短路了。

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define INF 100000000
     6 #define maxn 25
     7 using namespace std;
     8 int n;
     9 int edge[maxn][maxn];
    10 int dist[maxn];
    11 int s[maxn];
    12 int path[maxn];
    13 struct point
    14 {
    15     int num,len;
    16 }points[maxn];
    17 bool cmp(point a,point b)
    18 {
    19     return a.len<b.len;
    20 }
    21 void dijkstra(int v0)
    22 {
    23     int i,j,k;
    24     for(i=0;i<n;++i)
    25     {
    26         dist[i]=edge[v0][i];    s[i]=0;
    27         if(i!=v0&&dist[i]<INF)    path[i]=v0;
    28         else path[i]=1;
    29     }
    30     s[v0]=1;    dist[v0]=0;
    31     for(i=0;i<n-1;++i)
    32     {
    33         int min=INF,u=v0;
    34         for(j=0;j<n;++j)
    35         {
    36             if(!s[j]&&dist[j]<min)
    37             {
    38                 u=j;    min=dist[j];
    39             }
    40         }
    41         s[u]=1;
    42         for(k=0;k<n;++k)
    43         {
    44             if(!s[k]&&edge[u][k]<INF&&dist[u]+edge[u][k]<dist[k])
    45             {
    46                 dist[k]=dist[u]+edge[u][k];    path[k]=u;
    47             }
    48         }
    49     }
    50 }
    51 int main()
    52 {
    53     int i,j;
    54     cin>>n;
    55     for(i=0;i<n;++i)
    56         for(j=0;j<n;++j)
    57         {
    58             cin>>edge[j][i];
    59             if(edge[j][i]==-1) edge[j][i]=INF;
    60         }
    61     int begin,temp,count=0;
    62     cin>>begin;
    63     begin--;
    64     dijkstra(begin);
    65     while(cin>>temp)
    66     {
    67         if(temp==-2) break;
    68         points[count++].num=temp-1;
    69     }    
    70     for(i=0;i<count;++i)
    71         points[i].len=dist[points[i].num];
    72     sort(points,points+count,cmp);
    73     int shortest[maxn];
    74     cout<<"Org\tDest\tTime\tPath"<<endl;
    75     for(i=0;i<count;++i)
    76     {
    77         cout<<points[i].num+1<<"\t"<<begin+1<<"\t"<<points[i].len;
    78         memset(shortest,0,sizeof(shortest));
    79         int k=0;
    80         shortest[k]=points[i].num;
    81 
    82         while(path[shortest[k]]!=begin)
    83         {
    84             ++k;shortest[k]=path[shortest[k-1]];
    85         }
    86         k++;    shortest[k]=begin;
    87         if(shortest[k]==shortest[0]) cout<<"\t"<<shortest[k]+1;
    88         else
    89         for(j=0;j<=k;j++)
    90             cout<<"\t"<<shortest[j]+1;
    91         cout<<endl;
    92     }
    93 
    94     return 0;
    95 
    96 }
    97         
    98     
  • 相关阅读:
    莫队模板
    CF600E Lomsat gelral
    JZOJ 捕老鼠
    JZOJ 4896. 【NOIP2016提高A组集训第16场11.15】兔子
    JZOJ 4895【NOIP2016提高A组集训第16场11.15】三部曲
    双端队列xLIS问题
    最大K段和
    你真的了解ES6的promise吗?
    JS对象和数组深浅拷贝总结②
    当前页码删除唯一数据后加载前一页内容
  • 原文地址:https://www.cnblogs.com/symons1992/p/2745051.html
Copyright © 2011-2022 走看看