拣水题写的。还是拿邻接矩阵写的。。。。 用邻接表写去。。 那个hash函数是记录是否在队列里。。。开始理解错了。。 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> #include <queue> #include <string.h> #include <limits.h> using namespace std; queue<int> Q; int main() { int map[110][110]; int n,m,x,y; int dis[110]; int hash[110]; while( cin >> n && n ) { for(int i=1; i<=n; i++) { dis[i] = INT_MAX; map[i][i] = 0; for(int k=1; k<=n; k++) map[i][k] = INT_MAX; } for(int i=1; i<=n; i++) { cin >> m; for(int k=1; k<=m ;k++) { cin >> x >> y; map[i][x] = y; } } int min = INT_MAX,begin = -1; for(int i=1; i<=n; i++) { int max = 0; memset(hash,0,sizeof(hash)); for(int k=1; k<=n; k++) dis[k] = INT_MAX; dis[i] = 0; hash[i] = 1; Q.push(i); while( !Q.empty() ) { int ind = Q.front(); Q.pop(); hash[ind] = 0; for(int k=1; k<=n; k++) if( map[ind][k] != INT_MAX && dis[k] > dis[ind] + map[ind][k] ) { dis[k] = dis[ind] + map[ind][k]; if( !hash[k] ) { hash[k] = 1; Q.push(k); } } } for(int k=1; k<=n; k++) if( dis[k] > max ) max = dis[k]; if( max < min ) { begin = i; min = max; } } if( begin == -1 ) cout << "disjoint" << endl; else cout << begin << ' ' << min << endl; } return 0; } 邻接表的写好了,感觉比DIJ还省事。。。就是输入链表的时候有点麻烦,头插法 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> #include <queue> #include <limits.h> using namespace std; queue<int> Q; typedef struct edge { int ind,len; edge *next; }edge; edge *head[110],*p[110],node[110*110]; int main(void) { int n,m; int dis[110],hash[110]; while( cin >> n && n ) { memset( p,'/0',sizeof(p)); memset( head,'/0',sizeof(head)); int cou = 0; for(int i=1; i<=n; i++) { cin >> m; for(int k=1; k<=m; k++) { cin >> node[cou].ind >> node[cou].len; node[cou].next = p[i]; //头插法 p[i] = &node[cou]; cou++; } } int min = INT_MAX, begin = -1; for(int i=1; i<=n; i++) { int max = 0; for(int k=1; k<=n; k++) { head[k] = p[k]; dis[k] = INT_MAX; } memset(hash,0,sizeof(hash)); dis[i] = 0; hash[i] = 1; Q.push(i); while( !Q.empty() ) { int x = Q.front(); Q.pop(); hash[x] = 0; while( head[x] != NULL ) { int y = head[x]->ind; int len = head[x]->len; if( dis[y] > dis[x] + len ) { dis[y] = dis[x] + len; if( !hash[y] ) { Q.push(y); hash[y] = 1; } } head[x] = head[x]->next; // If you put this in the parentheses = =. } } for(int k=1; k<=n; k++) if( dis[k] > max ) max = dis[k]; if( max < min ) { min = max; begin = i; } } if( begin == -1 ) cout << "dispoint" << endl; else cout << begin << ' ' << min << endl; } return 0; }