zoukankan      html  css  js  c++  java
  • [kuangbin带你飞]专题四 最短路练习 POJ 3268 Silver Cow Party

    题意:

    在一个有向图中求n头牛从自己的起点走到x再从x走回来的最远距离

    思路一开始是暴力跑dij……

    讲道理不太可能……

    然后就百度了一下 才知道把矩阵转置的话就只需要求两次x的单源最短路……

     1 /* ***********************************************
     2 Author        :Sun Yuefeng
     3 Created Time  :2016/10/22 20:09:36
     4 File Name     :A.cpp
     5 ************************************************ */
     6 
     7 #include<cstdio>
     8 #include<iostream>
     9 #include<algorithm>
    10 #include<cmath>
    11 #include<cstring>
    12 #include<string>
    13 #include<bitset>
    14 #include<map>
    15 #include<set>
    16 #include<stack>
    17 #include<vector>
    18 #include<queue>
    19 #include<list>
    20 #define M(a,b) memset(a,b,sizeof(a))
    21 using namespace std;
    22 typedef long long ll;
    23 const int inf=0x3f3f3f3f;
    24 const int maxn=1e3+10;
    25 const int mod=1e7+7;
    26 int dx[8]= {0,0,1,-1,1,-1,1,-1};
    27 int dy[8]= {1,-1,0,0,-1,1,1,-1};
    28 
    29 int n,m,x,most;
    30 int waycome[maxn][maxn];
    31 int wayback[maxn][maxn];
    32 int dist[maxn];
    33 bool vis[maxn];
    34 
    35 void dijkstra(int x,int way[][maxn]){
    36     int dis[maxn];
    37     for(int i=1;i<=n;i++){
    38         dis[i]=inf;
    39         vis[i]=false;
    40     }
    41     dis[x]=0;
    42     for(int i=1;i<=n;i++){
    43         int k=-1;
    44         int min=inf;
    45         for(int j=1;j<=n;j++){
    46             if(!vis[j]&&dis[j]<min){
    47                 min=dis[j];
    48                 k=j;
    49             }
    50         }
    51         vis[k]=true;
    52         for(int j=1;j<=n;j++){
    53             if(dis[j]>dis[k]+way[k][j]&&!vis[j])
    54                 dis[j]=dis[k]+way[k][j];
    55         }
    56     }
    57     for(int i=1;i<=n;i++){
    58         dist[i]+=dis[i];
    59         if(dist[i]>most) most=dist[i];
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     //freopen("in.txt","r",stdin);
    66     //freopen("out.txt","w",stdout);
    67     while(scanf("%d%d%d",&n,&m,&x)!=EOF){
    68         M(waycome,inf);
    69         M(wayback,inf);
    70         M(dist,0);
    71         int u,v,w;
    72         most=-1;
    73         for(int i=0;i<m;i++){
    74             scanf("%d%d%d",&u,&v,&w);
    75             waycome[u][v]=w;
    76             wayback[v][u]=w;
    77         }
    78         dijkstra(x,waycome);
    79         dijkstra(x,wayback);
    80         printf("%d
    ",most);
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/general10/p/5988406.html
Copyright © 2011-2022 走看看