zoukankan      html  css  js  c++  java
  • poj3268Silver Cow Party

    题目链接:http://poj.org/problem?id=3268

    从终点进行两遍dijkstra,两遍之间要把矩阵转置一下。

    最后遍历各点更新最大值。

    dijkstra:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 const int maxn=1010;
     8 const int inf=9999999;
     9 int n,m,xx;
    10 int u,v,w;
    11 int pic[maxn][maxn];
    12 int vis[maxn];
    13 int d1[maxn],d2[maxn];
    14 void dijkstra(int *d)
    15 {
    16      memset(vis,0,sizeof(vis));
    17     for(int i=1;i<=n;i++)
    18         d[i]=(i==xx?0:inf);
    19         for(int i=0;i<n;i++)
    20         {
    21             int m=inf,x;
    22             for(int y=1;y<=n;y++)
    23                 if(!vis[y]&&d[y]<m) m=d[x=y];
    24             vis[x]=1;
    25             for(int y=1;y<=n;y++)
    26             {
    27                 if(!vis[y]&&d[y]>d[x]+pic[x][y]) {
    28                     d[y]=d[x]+pic[x][y];
    29                 }
    30             }
    31         }
    32 }
    33 void trans()   //矩阵转置
    34 {
    35     for(int i=1;i<=n;i++)
    36         for(int j=1;j<=i;j++)
    37         swap(pic[i][j],pic[j][i]);
    38 }
    39 int main()
    40 {
    41     while(scanf("%d%d%d",&n,&m,&xx)!=EOF)
    42     {
    43         for(int i=1;i<=n;i++)
    44             for(int j=1;j<=n;j++)
    45                 pic[i][j]=inf;
    46         for(int i=0;i<m;i++)
    47         {
    48             scanf("%d%d%d",&u,&v,&w);
    49             pic[u][v]=w;
    50         }
    51         dijkstra(d1);
    52         trans();
    53         dijkstra(d2);
    54        int  ans=-1;
    55         for(int i=1;i<=n;i++)
    56         {
    57             if(d1[i]!=inf&&d2[i]!=inf) ans=max(ans,d1[i]+d2[i]);
    58         }
    59         printf("%d
    ",ans);
    60     }
    61 }

    spfa:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 const int maxn=1010;
     8 const int inf=0x3f3f3f3f;
     9 int n,m,xx;
    10 int u,v,w;
    11 int pic[maxn][maxn];
    12 int inq[maxn];
    13 int que[maxn<<1];
    14 int d1[maxn],d2[maxn];
    15 
    16 
    17 void trans()
    18 {
    19     for(int i=1;i<=n;i++)
    20         for(int j=1;j<=i;j++)
    21         swap(pic[i][j],pic[j][i]);
    22 }
    23 
    24 void spfa(int *d)
    25 {
    26    for(int i=1;i<=n;i++)
    27        d[i]=inf;
    28 
    29     memset(inq,0,sizeof(inq));
    30     d[xx]=0;
    31     int tail=-1;
    32     que[++tail]=xx;
    33     inq[xx]=1;
    34     while(tail!=-1)
    35     {
    36         int cur=que[tail];
    37         tail--;
    38         inq[cur]=0;
    39         for(int i=1;i<=n;i++)
    40             if(d[i]>d[cur]+pic[cur][i])
    41         {
    42             d[i]=d[cur]+pic[cur][i];
    43             if(inq[i]==0) 
    44             {
    45                 que[++tail]=i;
    46                 inq[i]=1;
    47             }
    48         }
    49     }
    50 }
    51 
    52 
    53 int main()
    54 {
    55     while(scanf("%d%d%d",&n,&m,&xx)!=EOF)
    56     {
    57         for(int i=1;i<=n;i++)
    58             for(int j=1;j<=n;j++)
    59                 pic[i][j]=inf;
    60         for(int i=0;i<m;i++)
    61         {
    62             scanf("%d%d%d",&u,&v,&w);
    63             pic[u][v]=w;
    64         }
    65         spfa(d1);
    66         trans();
    67         spfa(d2);
    68        int  ans=-1;
    69         for(int i=1;i<=n;i++)
    70         {
    71             if(d1[i]!=inf&&d2[i]!=inf) ans=max(ans,d1[i]+d2[i]);
    72         }
    73         printf("%d
    ",ans);
    74     }
    75 }
  • 相关阅读:
    转: adroid音视延迟 10ms的原因与解答
    去应聘软件工程师记得这样介绍自己
    U盘中了磁碟机病毒怎么办
    Heartbeats
    视频格式研究
    开源镜像站汇总
    Linux各目录缩写含义
    虚拟中没有eth0
    使用#锚点时,jsp中不能有basePath
    android systemUI--Notification 整理
  • 原文地址:https://www.cnblogs.com/yijiull/p/6615918.html
Copyright © 2011-2022 走看看