题目大意:以各点为源,比较每次Dijkstra算法求出的值,求出最小值。如果图不连通,输出 Disjoint。
#include <iostream>
using namespace std;
#define MAX 1<<29
int n;
bool vis[101];
int dis[101][101];
int d[101]; //表示到各点的最短距离
int dijkstra(int start){
int i,j,k,dist;
int result;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
if(i == start)
d[i] = 0;
else
d[i] = MAX;
}
for(i=1;i<=n;i++){
dist = MAX;
k = 0;
for(j=1;j<=n;j++){
if(!vis[j]&&d[j]<=dist){
k = j;
dist = d[j];
}
}
vis[k] = 1;
for(j=1;j<=n;j++){
if(d[k]+dis[k][j]<d[j])
d[j] = d[k] + dis[k][j];
}
}
result = 0;
for(i=1;i<=n;i++){
if(d[i] > result)
result = d[i];
}
return result;
}
int main(){
int i,j,k,friends;
int temp,result,index;
while(cin>>n,n){
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
dis[i][j] = MAX;
for(i=1;i<=n;i++){
cin>>friends;
for(j=0;j<friends;j++){
cin>>k>>dis[i][k];
}
}
result = MAX;
index = 0;
for(i=1;i<=n;i++){
temp = dijkstra(i);
if(temp<result){
index = i;
result = temp;
}
}
if(index == 0)
cout<<"disjoint"<<endl;
else
cout<<index<<" "<<result<<endl;
}
return 0;
}
以上代码,声明,可以通过样例,但是 总是 Runtime Error,不知道哪里复杂度高了,关键是我看别人同样的算法A了,可我的就是通不过。。
下面尝试Floyd算法:
#include<iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
int map[N][N];
int n;
void Floyd(){
memset(map,INF,sizeof(map));
for(int i=1;i<=n;i++){
int t,x,s;
cin>>t;
while(t--){
cin>>x>>s;
map[i][x] = s;
}
}
for(int t=1;t<=n;t++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j] = min(map[i][j],map[i][t]+map[t][j]);
}
}
}
}
int main(){
while(cin>>n,n){
Floyd();
int ans = 0x3f3f3f3f;
int index = 0;
for(int i=1;i<=n;i++){
int temp = 0;
for(int j=1;j<=n;j++){
if(i == j)
continue;
if(map[i][j]>temp){
temp = map[i][j];
}
}
if(ans>temp){
ans = temp;
index = i;
}
}
if(ans == INF) cout<<"disjoint."<<endl;
cout<<index<<" "<<ans<<endl;
}
}
这道题 貌似 用 Floyd 算法更好一点,因为Floyd算法本来就是用来 解决这方面的问题----多源最短路问题
这道题是这样的,先用 Floyd 求出每两点之间的最短距离。
然后 求出每一点 距离其他点的最长距离,这里是保证每个点都被传播到。
最后,将每点求出的距离作一个比较,求出最小值,因为这每一个解都是可行的,只不过要选择一个 时间最少的。