最短路径问题
#include<iostream>
#include<cstdio>
#include<string.h>
#include<limits.h>
using namespace std;
int map[110][110];
int dist[110];
bool flag[110];
int dijkstra(int start,int n)
{
int i,j,mark,mini,maxi;
memset(dist,0,sizeof(dist));
memset(flag,0,sizeof(flag));
flag[start]=1;
maxi=0;
for(j=0;j<n;j++)
{
mini=INT_MAX;
for(i=1;i<=n;i++)
{
if(flag[i]==0)
{
if(map[start][i]!=0&&dist[i]==0)
dist[i]=dist[start]+map[start][i];
else if(map[start][i]!=0&&dist[i]>dist[start]+map[start][i])
{
dist[i]=dist[start]+map[start][i];
}
if(dist[i]<mini&&dist[i]!=0)
{
mini=dist[i];
mark=i;
}
}
}
if(mini==INT_MAX) break;
if(dist[mark]>maxi) maxi=dist[mark];
flag[mark]=1;
start=mark;
}
if(j==n-1) return maxi;
else return INT_MAX;
}
int main()
{
int n,m,i,j,k;
int time,mini,temp,mark;
while(scanf("%d",&n)&&n)
{
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=0;j<m;j++)
{
scanf("%d%d",&k,&time);
map[i][k]=time;
}
}
mini=INT_MAX;
for(i=1;i<=n;i++)
{
if((temp=dijkstra(i,n))<mini)
{
mark=i;
mini=temp;
}
}
if(mini==INT_MAX) printf("disjoint\n");
else printf("%d %d\n",mark,mini);
}
return 0;
}