http://poj.org/problem?id=3268
题目大意:奶牛派对,有N个农场,每个农场的奶牛要到X号奶牛场去参加派对,农场之间有单向通道,每个农场的奶牛都会选择最短的往返路径,对所有的奶牛来说,花费在去派对的路上和返回农场的时间最长是多少!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000010
#define MAXN 1010
#define INF 0xfffffff
typedef struct edge
{
int v,w;
struct edge *next;
}edge;
typedef struct vnode
{
edge *first;
}vnode;
typedef struct node
{
int x,y;
}node;
vnode map[MAX];
int dist[MAXN];
int disv[MAXN];
int queue[MAX];
int n,m;
void bellman_spa(int v0)
{
int front=0,rear=0,i;
edge *p;
queue[rear++]=v0;
for (i=1;i<=n;i++)
{
dist[i]=INF;
}
dist[v0]=0;
while (rear>front)
{
int tail=queue[front++];
p=map[tail].first;
while (p)
{
if (dist[tail]+p->w<dist[p->v])
{
queue[rear++]=p->v;
dist[p->v]=dist[tail]+p->w;
}
p=p->next;
}
}
}
int main()
{
int X;
while (~scanf("%d%d%d",&n,&m,&X))
{
int i,j;
int u,v,w,max=-MAX;
edge *p;
for (i=1;i<=n;i++)
{
map[i].first=NULL;
}
for (i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
p=(edge *)malloc(sizeof(edge));
p->v=v;
p->w=w;
p->next=map[u].first;
map[u].first=p;
}
bellman_spa(X); //先求出举行派对的农场到各个农场的最短路径,即奶牛从举行派对的农场返回的最短路径
for (i=1;i<=n;i++)
{
disv[i]=dist[i];
}
for (i=1;i<=n;i++)
{
bellman_spa(i);
if (dist[X]+disv[i]>max) //然后依次求出个农场到举行派对的农场的最短路径,与先前求出的返回距离相加。然后比较求出最长的时间
max=dist[X]+disv[i];
}
printf("%d\n",max);
}
return 0;
}