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;
}