题意:有n个点,求从一个点到其他所有点的最短路中的最长路。SPFA和Dijkstra都可以。
SPFA:
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<stdio.h>
const int maxn=108;
const int INF=0x3f3f3f3f;
using namespace std;
struct Edge
{
int y,time;
};
vector<Edge>G[maxn];
int dis[maxn];
void SPFA(int s)
{
memset(dis,INF,sizeof(dis));
dis[s]=0;
queue<int>que;
que.push(s);
while(!que.empty())
{
int q=que.front();
que.pop();
for(int i=0;i<G[q].size();i++)
{
Edge r=G[q][i];
if(dis[r.y]>dis[q]+r.time)
{
dis[r.y]=dis[q]+r.time;
que.push(r.y);
}
}
}
}
int main()
{
int n;
cin>>n;
char s[100];
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i-1;j++)
{
cin>>s;
if(s[0]!='x')
{
int x;
sscanf(s, "%d", &x); //转换为数字
G[i].push_back((Edge){j,x});
G[j].push_back((Edge){i,x});
}
}
}
SPFA(1);
int ans=-INF;
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
cout<<ans<<endl;
return 0;
}
Dijkstra:
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=105;
int MAP[105][105];
int vis[105];
int dis[105];
int n;
void Dijkstra(int s)
{
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
for(int i=1;i<=n-1;i++)
{
int minn=INF,u;
for(int j=1;j<=n;j++)
{
if(dis[j]<minn&&vis[j]==0)
{
minn=dis[j];
u=j;
}
}
vis[u]=1;
for(int v=1;v<=n;v++)
{
if(dis[v]>dis[u]+MAP[u][v]&&vis[v]==0)
{
dis[v]=dis[u]+MAP[u][v];
}
}
}
}
int main()
{
cin>>n;
char s[100];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
MAP[i][j]=0;
else
MAP[i][j]=INF;
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i-1;j++)
{
cin>>s;
if(s[0]!='x')
{
int x;
sscanf(s,"%d",&x);
MAP[i][j]=MAP[j][i]=x;
}
}
}
Dijkstra(1);
int ans=-INF;
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
cout<<ans<<endl;
return 0;
}