题目链接:
http://poj.org/problem?id=1125
题意:
这道题题意比较难理解,于是我根据题目数据YY了一下,题目是给出每个点到其他点的时间,求出遍历所有点后,到达最远点时所花的时间以及出发点,这道题和HDU 4460比较相似,但是HDU 4460数据后来加强了,至今还是T。
题解:
n次SPFA即可。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define MAXN 10000
using namespace std;
const unsigned long long INF = 9999999999LL;
int cnt,n,m;
int dist[MAXN],head[MAXN];
bool vis[MAXN];
queue <int> Q;
struct node
{
int u,v,next,w;
}edge[MAXN * 2];
void add(int u, int v, int w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void init()
{
while(!Q.empty())
{
Q.pop();
}
cnt = 0;
memset(head,-1,sizeof(head));
memset(vis,false,sizeof(vis));
}
void spfa(int s)
{
for(int i = 1; i <= n; i++)
dist[i] = INF;
dist[s] = 0;
Q.push(s);
vis[s] = true;
while(!Q.empty())
{
int u = Q.front();
Q.pop();
vis[u] = false;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(dist[u]+edge[i].w<dist[v])
{
dist[v]=dist[u]+edge[i].w;
if(!vis[v])
{
vis[v]=true;
Q.push(v);
}
}
}
}
}
int main()
{
while(~scanf("%d", &n))
{
if(n == 0)break;
init();
for(int i = 1; i <= n; i++)
{
scanf("%d", &m);
while(m--)
{
int v,w;
scanf("%d %d", &v, &w);
add(i,v,w);
}
}
int ansa = 0, ansb = 0, minansb = INF;
for(int i = 1; i <= n; i++)
{
spfa(i);
ansb = 0;
for(int j = 1; j <= n; j++)
ansb = max(ansb, dist[j]);
if(ansb < minansb)
{
ansa = i;
minansb = ansb;
}
}
if(minansb == INF)
printf("disjoint\n");
else
printf("%d %d\n", ansa, minansb);
}
return 0;
}