• hdu 2680 多起点一终点


    注意这是一个有向图! 多起点,一终点 反过来,看成一个起点,多个终点,找最短路 因为是有向图 所以u->v 要也要反过来成为v->u

    Sample Input
    5 8 5 //结点数 边数 终点
    1 2 2 //u v w
    1 5 3
    1 3 4
    2 4 7
    2 5 6
    2 3 5
    3 5 1
    4 5 1
    2
    2 3 //起点
    4 3 4
    1 2 3
    1 3 4
    2 3 2
    1
    1

    Sample Output
    1
    -1

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # define LL long long
     7 using namespace std ;
     8 
     9 const int MAXN=1010;
    10 const int INF=0x3f3f3f3f;
    11 int n ;
    12 bool vis[MAXN];
    13 int cost[MAXN][MAXN] ;
    14 int lowcost[MAXN] ;
    15 int pre[MAXN];
    16 void Dijkstra(int beg)
    17 {
    18     for(int i=0;i<n;i++)
    19     {
    20         lowcost[i]=INF;vis[i]=false;pre[i]=-1;
    21     }
    22     lowcost[beg]=0;
    23     for(int j=0;j<n;j++)
    24     {
    25         int k=-1;
    26         int Min=INF;
    27         for(int i=0;i<n;i++)
    28             if(!vis[i]&&lowcost[i]<Min)
    29             {
    30                 Min=lowcost[i];
    31                 k=i;
    32             }
    33             if(k==-1)break;
    34             vis[k]=true;
    35             for(int i=0;i<n;i++)
    36                 if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
    37                 {
    38                     lowcost[i]=lowcost[k]+cost[k][i];
    39                         pre[i]=k;
    40                 }
    41     }
    42 }
    43 
    44 int main ()
    45 {
    46     //freopen("in.txt","r",stdin) ;
    47     int m , s ;
    48     while (scanf("%d %d %d" , &n , &m , &s) !=EOF)
    49     {
    50 
    51         int u , v , w ;
    52         int i , j ;
    53         memset(cost, INF, sizeof(cost));
    54          while(m--)
    55         {
    56             scanf("%d%d%d" , &u , &v , &w) ;
    57             if (w < cost[v-1][u-1]) //防止重边
    58             {
    59                 cost[v-1][u-1] = w ;
    60             }
    61         }
    62         Dijkstra(s-1) ;
    63         scanf("%d" , &m) ;
    64         int e ;
    65         int MIN = INF ;
    66         while(m--)
    67         {
    68             scanf("%d" , &e) ;
    69             if (lowcost[e-1] < MIN)
    70                 MIN = lowcost[e-1] ;
    71         }
    72 
    73         if (MIN != INF)
    74             printf("%d
    " , MIN) ;
    75         else
    76             printf("-1
    ") ;
    77     }
    78 
    79     return 0 ;
    80 }
    View Code

    堆优化

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # include <queue>
     7 # define LL long long
     8 using namespace std ;
     9 
    10 const int INF=0x3f3f3f3f;
    11 const int MAXN=1100;
    12 struct qnode
    13 {
    14     int v;
    15     int c;
    16     qnode(int _v=0,int _c=0):v(_v),c(_c){}
    17     bool operator <(const qnode &r)const
    18     {
    19         return c>r.c;
    20     }
    21 };
    22 struct Edge
    23 {
    24     int v,cost;
    25     Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
    26 };
    27 vector<Edge>E[MAXN];
    28 bool vis[MAXN];
    29 int dist[MAXN];
    30 int n ;
    31 void Dijkstra(int start)//点的编号从1开始
    32 {
    33     memset(vis,false,sizeof(vis));
    34     for(int i=1;i<=n;i++)dist[i]=INF;
    35     priority_queue<qnode>que;
    36     while(!que.empty())que.pop();
    37     dist[start]=0;
    38     que.push(qnode(start,0));
    39     qnode tmp;
    40     while(!que.empty())
    41     {
    42         tmp=que.top();
    43         que.pop();
    44         int u=tmp.v;
    45         if(vis[u])continue;
    46         vis[u]=true;
    47         for(int i=0;i<E[u].size();i++)
    48         {
    49             int v=E[tmp.v][i].v;
    50             int cost=E[u][i].cost;
    51             if(!vis[v]&&dist[v]>dist[u]+cost)
    52             {
    53                 dist[v]=dist[u]+cost;
    54                 que.push(qnode(v,dist[v]));
    55             }
    56         }
    57     }
    58 }
    59 void addedge(int u,int v,int w)
    60 {
    61     E[u].push_back(Edge(v,w));
    62 }
    63 
    64 int main ()
    65 {
    66     //freopen("in.txt","r",stdin) ;
    67     int m , s ;
    68     while (scanf("%d %d %d" , &n , &m , &s) !=EOF)
    69     {
    70 
    71         int u , v , w ;
    72         int i , j ;
    73         for(i=1;i<=n;i++)
    74             E[i].clear();
    75 
    76          while(m--)
    77         {
    78             scanf("%d%d%d" , &u , &v , &w) ;
    79             addedge(v,u,w) ;
    80         }
    81         Dijkstra(s) ;
    82         scanf("%d" , &m) ;
    83         int e ;
    84         int MIN = INF ;
    85         while(m--)
    86         {
    87             scanf("%d" , &e) ;
    88             if (dist[e] < MIN)
    89                 MIN = dist[e] ;
    90         }
    91 
    92         if (MIN != INF)
    93             printf("%d
    " , MIN) ;
    94         else
    95             printf("-1
    ") ;
    96     }
    97 
    98     return 0 ;
    99 }
    View Code
  • 相关阅读:
    Android之剑法初略:dalvik vm和jvm比较
    人民币阿拉伯数字转换为汉字大写 code
    数据库定时备份方案及实践
    [postfix]添加黑名单
    [php][随机数]曲线式的随机
    记公司服务器维护经历
    批量修改符号链接实现思路
    复杂数组的签名生成方法
    [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选
    [已解决]centos6.4 php连接mysql和memcache提示权限不允许
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4587909.html
Copyright © 2020-2023  润新知