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
原文地址:https://www.cnblogs.com/mengchunchen/p/4587909.html