裸的最短路径问题,这应该是以前的一道月赛题,一开始用floyd写的,这次用spfa+优先队列优化,还有存图的方式和以前不同。。。
题意:求出在哪个点发起谣言,传到每个人的所用的时间最少,以每个点为源点枚举求最短路。。。。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#define N 105
#define inf 0xfffff
using namespace std;
struct Gnode
{
Gnode() {}
Gnode(int num,int time):num(num),time(time) {}
int num,time;
bool operator<(const Gnode &now) const
{return now.time<time;}
};
int dis[N];
void SPFA(vector<vector<Gnode> >&Graph,int start)
{
priority_queue<int> Q;
dis[start]=0;
Q.push(start);
while(!Q.empty())
{
int cur=Q.top();
Q.pop();
for(int i=0;i<Graph[cur].size();++i)
{
if(dis[cur]!=inf&&dis[cur]+Graph[cur][i].time<dis[Graph[cur][i].num])
{
dis[Graph[cur][i].num]=dis[cur]+Graph[cur][i].time;
Q.push(Graph[cur][i].num);
}
}
}
}
void init()
{
for(int i=0;i<N;++i)
dis[i]=inf;
}
int main()
{
int n;
while(cin>>n&&n)
{
vector<vector<Gnode> >Graph (n+1);
for(int i=1;i<=n;++i)
{
int num;
cin>>num;
for(int j=0;j!=num;++j)
{
int a,b;
cin>>a>>b;
Graph[i].push_back(Gnode(a,b));
}
}
int minx=inf,p;
for(int i=1;i<=n;++i)
{
init();
SPFA(Graph,i);
int maxx=-inf;
for(int j=1;j<=n;++j)
maxx=max(dis[j],maxx);
if(maxx<minx) {p=i;minx=maxx;}
}
cout<<p<<" "<<minx<<endl;
}return 0;
}