求有向图中从某个顶点出发到其他顶点的最长路径最短。对每个顶点都用dijkstra求出到其他顶点的最短路径,然后选最短的一个。不连通的话要输出disjoint,联通就输出最佳顶点和最长路径。
然后这个用例到底怎么读的看了好久……原来是包括了两个用例
poj好像不支持bits/stdc++,一直ce
#include <iostream>
#include <cstdio>
#define INF 9999999
using namespace std;
const int maxn=110;
int num=-1;
int g[maxn][maxn];
int d[maxn];
bool vis[maxn];
void dij(int s){
fill(d,d+maxn,INF);
fill(vis,vis+maxn,false);
d[s]=0;
for(int i=1;i<=num;i++){
int u=-1,MIN=INF;
for(int j=1;j<=num;j++){
if(!vis[j]&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int v=1;v<=num;v++){
if(!vis[v]&&g[u][v]!=INF&&d[u]+g[u][v]<d[v]){
d[v]=d[u]+g[u][v];
}
}
}
}
int main(){
while(1){
cin>>num;
if(num==0)break;
fill(g[0],g[0]+maxn*maxn,INF);
for(int i=1;i<=num;i++){
int n2;
cin>>n2;
for(int j=1;j<=n2;j++){
int a,b;
cin>>a>>b;
g[i][a]=b;
}
}
int maxval=INF, maxidx=-1;
for(int i=1;i<=num;i++){
dij(i);
int val=-1;
for(int j=1;j<=num;j++){
val=max(d[j],val);
}
if(val<maxval){
maxval=val;
maxidx=i;
}
}
if(maxval==INF)printf("disjoint\n");
else printf("%d %d\n",maxidx,maxval);
}
}