0
点赞
收藏
分享

微信扫一扫

Silver Cow Party dijkstra 邻接矩阵

穆熙沐 2022-06-29 阅读 49

Silver Cow Party    dijkstra 邻接矩阵_ios题意:floyd 会tle ,只有靠杰哥了。题目的意思是让你从n个点到x点的每条最短路径中选取 某一点前往x点和返回原来的点所耗费的时间之和 最大的那一组,并输出最大值。
思路:迪杰斯特拉搞一搞,这里会用到转置矩阵,从而实现求出前往x点和返回x点两条路径。(稠密图用邻接矩阵!!)

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-04-22.17.13
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1010;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
int d[maxn][maxn], n;
int dis[maxn], dis1[maxn];
void dijkstra(int x) {
int vis[maxn], min, next = x;
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; ++i)
dis[i] = d[x][i];
vis[x] = 1;
for(int i = 2; i <= n; ++i) {
min = INF;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && dis[j] < min) {
min = dis[j];
next = j;
}
}
vis[next] = 1;
for(int j = 1; j <= n; ++j) {
if(!vis[j] && dis[j] > dis[next] + d[next][j])
dis[j] = dis[next] + d[next][j];
}
}
}

int main() {
int m, w,x;
int maxnn=-minn;
cin >> n >> m >> x;
memset(d, INF, sizeof d);
for(int i = 1; i <= n; ++i)
d[i][i] = 0;
int a, b;
while(m--) {
cin >> a >> b >> w;
d[a][b] = w;
}
dijkstra(x);
int ans = 0;
for(int i = 1; i <= n; i++)
if(i != x)
dis1[i] = dis[i];
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++) {
int t = d[i][j];
d[i][j] = d[j][i];
d[j][i] = t;
}
dijkstra(x);
for(int i=1;i<=n;i++)
if(i!=x)
maxnn=max(dis1[i]+dis[i],maxnn);
cout << maxnn<< endl;
return 0;
}


举报

相关推荐

0 条评论