POJ 3268 :http://poj.org/problem?id=3268
n为1000,m为100000
题目大意: 有很多牛分别从点X出发,到达各点,并返回回点X,问这些牛中经过的的最短路中,最大的最短路为多少。
其实就是以X为起点的最短路,然后将边反转方向一下,再求一次最短路。
两次和相加起来,扫一遍得到最大最短路。。。。
用pos保存了每条边,两次输入到 edge里面。
RE了很多次,后来发现错误是,把边数默认为 1000了。
依然是Spfa,很好用:
#include"cstdio"
#include"iostream"
#include"cstring"
#include"algorithm"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
#define INF 9999999
#define inf 1009
#define loop(x,y,z) for(x=y;x<z;x++)
#define ll long long
int n,m,s;
int book[inf];
int dis[inf];
int ans[inf];
int pos[100009][3];
queue<int>q;
struct node
{
int to,w;
node(int i,int j)
{
to=i;
w=j;
}
};
vector<node>edge[inf];
void init()
{
int i;
loop(i,1,n+1)
edge[i].clear();
loop(i,1,n+1)
dis[i]=INF;
dis[s]=0;
memset(book,0,sizeof book);
while(!q.empty())q.pop();
}
void Spfa()
{
q.push(s);
book[s]=1;
int i;
while(!q.empty())
{
int u=q.front();
q.pop();
book[u]=0;
int len=edge[u].size();
loop(i,0,len)
{
node& e=edge[u][i];
if(dis[e.to]>dis[u]+e.w)
{
dis[e.to]=dis[u]+e.w;
if(!book[e.to])
{
q.push(e.to);
book[e.to]=1;
}
}
}
}
}
int main()
{
int i,j,k;
scanf("%d%d%d",&n,&m,&s);
loop(i,0,m)
scanf("%d%d%d",&pos[i][0],&pos[i][1],&pos[i][2]);
memset(ans,0,sizeof ans);
init();
loop(i,0,m)
edge[pos[i][0]].push_back(node(pos[i][1],pos[i][2]));
Spfa();
loop(i,1,n+1)
ans[i]+=dis[i];
init();
loop(i,0,m)
edge[pos[i][1]].push_back(node(pos[i][0],pos[i][2]));
Spfa();
loop(i,1,n+1)
ans[i]+=dis[i];
int big=0;
loop(i,1,n+1)
if(ans[i]>big)
big=ans[i];
printf("%d\n",big);
return 0;
}