裸的最短路徑問題,這應該是以前的一道月賽題,一開始用floyd寫的,這次用spfa+優先隊列最佳化,還有存圖的方式和以前不同。。。
題意:求出在哪個點發起謠言,傳到每個人的所用的時間最少,以每個點為源點枚舉求最短路。。。。
#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<queue>#define N 105#define inf 0xfffffusing 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;}