POJ3268Dijkstra

题意:给定n个点,m条边,求所有顶点中到顶点x的来回最短距离

分析:考虑到数据范围,选用Dijkstra,用Floyd会超时

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int INF=1<<25;
15 const int maxn=1010;
16 struct edge{
17     int to,cost;
18 };
19 typedef pair<int,int> P;
20 vector<edge> g[maxn];
21 int d[maxn];
22 int dp[maxn][maxn];
23 int n,m,x;
24 void dijkstra(int s)
25 {
26     priority_queue<P, vector<P>, greater<P> > que;
27     fill(d,d+n+1,INF);
28     d[s]=0;
29     que.push(P(0,s));
30     while(!que.empty()){
31         P p=que.top();  que.pop();
32         int v=p.second;
33         if(d[v]<p.first)  continue;
34         for(int i=0;i<g[v].size();i++){
35             edge e=g[v][i];
36             if(d[e.to]>d[v]+e.cost){
37                 d[e.to]=d[v]+e.cost;
38                 que.push(P(d[e.to],e.to));
39             }
40         }
41     }
42 }
43 int main()
44 {
45     while(cin>>n>>m>>x)
46     {
47         for(int i=0;i<=n;i++)
48             for(int j=0;j<=n;j++)
49                 dp[i][j]=INF;
50         for(int i=0;i<m;i++)
51         {
52             edge e;
53             int a,b,num;
54             scanf("%d%d%d",&a,&b,&num);
55             e.to=b,e.cost=num;
56             g[a].push_back(e);
57         }
58         for(int i=1;i<=n;i++){
59             dijkstra(i);
60             for(int j=1;j<=n;j++)
61                 dp[i][j]=d[j];
62         }
63         int cnt;
64         int mx=0;
65         for(int i=1;i<=n;i++){
66             cnt=0;
67             cnt+=dp[i][x];
68             cnt+=dp[x][i];
69             mx=max(cnt,mx);
70         }
71         cout<<mx<<endl;
72     }
73     return 0;
74 }
View Code

 

转载于:https://www.cnblogs.com/wolf940509/p/5694231.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值