题目连接
https://www.acwing.com/problem/content/description/4246/
http://poj.org/problem?id=1502
思路
没啥好说的就是一个裸的求单源最短路,只不过边的信息建立需要自己判断是否存在,范围在100以内,那么基本上所有的最短路都能过,我这里就给出迪杰斯特拉和Floyd的代码
代码
迪杰斯特拉
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e2+10;
int n,dis[N];
bool vis[N];
struct Node{
int v,w;
};
vector<Node> E[N];
int toint(string s){
int res = 0;
for(int i = 0,l = s.size();i < l; ++i) res = res * 10 + s[i] - '0';
return res;
}
void DJ(int s){
for(int i = 1;i <= n; ++i) dis[i] = INF;
priority_queue<PII,vector<PII>,greater<PII> > que;
que.push({0,s});
dis[s] = 0;
while(!que.empty()){
int t = que.top().second;
que.pop();
if(vis[t]) continue;
vis[t] = true;
for(int i = 0,l = E[t].size();i < l; ++i) {
int j = E[t][i].v;
int w = E[t][i].w;
if(dis[j] > dis[t] + w){
dis[j] = dis[t] + w;
que.push({dis[j],j});
}
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
string num;
for(int i = 2;i <= n; ++i)
for(int j = 1;j < i; ++j){
cin>>num;
if(num != "x"){
int w = toint(num);
E[i].push_back({j,w});
E[j].push_back({i,w});
}
}
DJ(1);
int ans = 0;
for(int i = 1;i <= n; ++i) ans = max(ans,dis[i]);
cout<<ans<<endl;
return 0;
}
Floyd
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define PII pair<int,int>
const int INF = 0x3f3f3f3f;
const int N = 1e2+10;
int n,f[N][N];
int toint(string s){
int res = 0;
for(int i = 0,l = s.size();i < l; ++i) res = res * 10 + s[i] - '0';
return res;
}
void Floyd(){
for(int k = 1;k <= n; ++k)
for(int i = 1;i <= n; ++i)
for(int j = 1;j <= n; ++j)
f[i][j] = min(f[i][k] + f[k][j],f[i][j]);
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i = 1;i <= n; ++i)
for(int j = 1;j <= n; ++j)
f[i][j] = i==j?0:INF;
string num;
for(int i = 2;i <= n; ++i)
for(int j = 1;j < i; ++j){
cin>>num;
if(num != "x")
f[i][j] = f[j][i] = min(f[i][j],toint(num));
}
Floyd();
int ans = 0;
for(int i = 1;i <= n; ++i) ans = max(ans,f[1][i]);
cout<<ans<<endl;
return 0;
}