题意大概是有n个农场n头牛,要去x农场的牛。去和返回都要走最短路,问耗费时间最长的那条路是多少。
首先想到就的就是floyd算法果然TLE了。
先附上TLE的代码
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=1000+10;
const int INF=1e9;
int e[maxn][maxn];
int n,m,x;//表示n个农场m条路目标x农场。
void floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
e[i][j]=min(e[i][k]+e[k][j],e[i][j]);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&x);
x--;//编号要减一
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
e[i][j]=INF;
for(int i=0;i<n;i++)
e[i][i]=0;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
--a,--b;
e[a][b]=c;
}
floyd();
int ans=0;
for(int i=0;i<n;i++)
{
ans=max(ans,e[i][x]+e[x][i]);
}
printf("%d",ans);
return 0;
}
接下来仔细的想了下,这题用DIJ也可以做。
附上dij的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
typedef pair<int ,int> PII;//PII.second代表当前点,PII.first代表最短距离。
const int maxn=1000+10;
const int INF=1E9;
struct edge{
int to,cost;
edge(){}
edge(int to,int cost): to(to),cost(cost){}
};
vector<edge> g[maxn];
int d[maxn][maxn];//最短距离
int n,e;
//优先队列加速的dij
void dij(int s)
{
priority_queue<PII,vector<PII>,greater<PII> > que;
memset(d[s],0x3f,maxn*sizeof(int));
d[s][s]=0;
que.push(PII(0,s));
while(!que.empty())
{
PII p=que.top();
que.pop();
int u=p.second;
if(d[s][u]<p.first) continue;
for(int i=0;i<g[u].size();i++)
{
edge ed=g[u][i];
if(d[s][ed.to]>d[s][u]+ed.cost)
{
d[s][ed.to]=d[s][u]+ed.cost;
que.push(PII(d[s][ed.to],ed.to));
}
}
}
}
int main()
{
int m,x;
scanf("%d%d%d",&n,&m,&x);
//编号减一。。
x--;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
a--;
b--;
g[a].push_back(edge(b,c));
}
for(int i=0;i<n;i++) dij(i);
int ans=-INF;
for(int i=0;i<n;i++)
{
if(i!=x) ans=max(ans,d[i][x]+d[x][i]);
}
printf("%d\n",ans);
}