zoukankan      html  css  js  c++  java
  • Contest2037

    【题解】:

    最短路径问题,保证距离最短的同时,学妹权值最大,哈哈

    【code】:

      1 #include<iostream>
      2 #include<queue>
      3 #include<stdio.h>
      4 #include<string.h>
      5 #include<stdlib.h>
      6 
      7 #define N 50005
      8 #define INF 100000000
      9 using namespace std;
     10 
     11 struct Edge
     12 {
     13     int to;
     14     int next;
     15     int w;
     16     int num;
     17 }edge[N<<1];
     18 
     19 struct Nod
     20 {
     21    int u;
     22    int dis;
     23    int num;
     24 }now,temp;
     25 
     26 bool operator< (Nod a,Nod b)
     27 {
     28     if(a.dis!=b.dis)
     29         return a.dis>b.dis;
     30     return a.num<b.num;
     31 }
     32 
     33 int weight[N],head[N],visit[N];
     34 int dis[N];
     35 int ans[N];
     36 
     37 void init(int n)
     38 {
     39     int i;
     40     for(i=0;i<=n;i++)
     41     {
     42         visit[i] = 0;
     43         dis[i] = INF;
     44         head[i] = -1;
     45         ans[i]=-1;
     46     }
     47 }
     48 
     49 void Dijkstra(int s)
     50 {
     51     int i,v;
     52     dis[s] = 0;
     53     ans[s] = weight[s];
     54     priority_queue<Nod> p_q;
     55     temp.dis = 0;
     56     temp.u = s;
     57     temp.num = weight[s];
     58     p_q.push(temp);
     59     while(!p_q.empty())
     60     {
     61         temp = p_q.top();
     62         p_q.pop();
     63         if(visit[temp.u])  continue;
     64         visit[temp.u] = 1;
     65         for(i=head[temp.u];i!=-1;i=edge[i].next)
     66         {
     67             v = edge[i].to;
     68             if(!visit[v])
     69             {
     70                 if(dis[v]>dis[temp.u]+edge[i].w||(dis[v]!=INF&&dis[v]==dis[temp.u]+edge[i].w&&ans[v]<ans[temp.u]+weight[v]))
     71                 {
     72                     dis[v] = dis[temp.u]+edge[i].w;
     73                     ans[v] = ans[temp.u]+weight[v];
     74                     now.u = v;
     75                     now.dis = dis[v];
     76                     now.num = ans[v];
     77 
     78                     p_q.push(now);
     79                 }
     80             }
     81         }
     82     }
     83 }
     84 
     85 int main()
     86 {
     87     int m,n;
     88     while(~scanf("%d%d",&n,&m))
     89     {
     90         int i;
     91         for(i=0;i<n;i++)    scanf("%d",weight+i);
     92         int id = 0;
     93         init(n);
     94         int a,b,c;
     95         for(i=0;i<m;i++)
     96         {
     97             scanf("%d%d%d",&a,&b,&c);
     98             a--,b--;
     99             edge[id].to = b;
    100             edge[id].w = c;
    101             edge[id].next = head[a];
    102             head[a] = id++;  //将边 a --> b保存
    103 
    104             edge[id].to = a;
    105             edge[id].w = c;
    106             edge[id].next = head[b];
    107             head[b] = id++;  //将边 b --> a保存
    108         }
    109         Dijkstra(0);
    110         printf("%d
    ",ans[n-1]);
    111     }
    112     return 0;
    113 }
  • 相关阅读:
    581. 最短无序连续子数组
    217. 存在重复元素
    189. 旋转数组
    169. 多数元素
    122. 买卖股票的最佳时机 II
    119. 杨辉三角 II
    118. 杨辉三角
    外显子分析思路总结(Exome Sequencing Analysis review)
    宁夏采样记20181129
    haploview出现“results file must contain a snp column”的解决方法
  • 原文地址:https://www.cnblogs.com/crazyapple/p/3349480.html
Copyright © 2011-2022 走看看