zoj1082Stockbroker Grapevine

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int n,g[101][101],d[101];
const int INF=10000000;
int broken;
int spfa(int x)
{
     queue <int > q;
	 q.push(x);
     bool inq[101];
	 memset(inq,0,sizeof(inq));
	 for(int i=1;i<=n;i++)d[i]=(i==x?0:INF);
	 while(!q.empty())
	 {
		 int t=q.front();
		 q.pop();
		 inq[t]=0;
		 for(int i=1;i<=n;i++)
		 {
			 if(g[t][i]&&d[i]>d[t]+g[t][i])
			 {
                   d[i]=d[t]+g[t][i];
				   if(!inq[i])
				   {
					   inq[i]=1;
					   q.push(i);
				   }
			 }
		 }
	 }
	 broken=0;
	 for(int i=1;i<=n;i++)
		 if(d[i]==INF)broken=1;
	 int mint=-INF;
	 for(int i=1;i<=n;i++){mint=max(d[i],mint);}
	 return mint;
}

int main()
{
    while(cin>>n&&n)
	{
		int m,k,w;
		memset(g,0,sizeof(g));
		for(int i=1;i<=n;i++)
		{
            cin>>m;
			for(int j=1;j<=m;j++)
			{
				cin>>k>>w;
				g[i][k]=w;
			}
		}
		int ANS=-1,tmp=INF,haha;
	    for(int i=1;i<=n;i++)
		{
			haha=spfa(i);
			if(tmp>haha&&!broken){tmp=haha;ANS=i;}
		}
		if(ANS==-1)cout<<"disjoint"<<endl;
		else cout<<ANS<<" "<<tmp<<endl;
	}
}
posted on 2011-04-21 19:08  4.5.6  阅读(152)  评论(0编辑  收藏  举报