一.原题链接:http://poj.org/problem?id=1125
二.题目大意:一个经纪人可以与其他经济人联系,输入第一行经纪人的数量,接下来每行为从1~n个经济人分别可以跟谁联系,和联系的时间。
三.思路:第一次做最短路,然后看了一下午Dijkstra算法,勉强AC了。
四.代码
Dijkstra算法:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_SIZE = 128, INF = 1<<30; int numOfVertex; int graph[MAX_SIZE][MAX_SIZE]; void Dijkstra(int startPos, int dist[]) { int i, j, minPath, nextPos; bool visited[MAX_SIZE] = {0}; //initialize first vertex visited[startPos] = true; for(i = 1; i <= numOfVertex; i++){ if(graph[startPos][i] > 0 && !visited[i]){ dist[i] = graph[startPos][i]; } else{ dist[i] = INF; } } dist[startPos] = 0; for(i = 2; i <= numOfVertex; i++){ minPath = INF; //find minPath for(j = 1; j <= numOfVertex; j++){ if(dist[j] < minPath && !visited[j]){ minPath = dist[j]; startPos = j; } } //move visited[startPos] = true; for(j = 1; j <= numOfVertex; j++){ if(graph[startPos][j] > 0 && !visited[j] && minPath + graph[startPos][j] < dist[j] ){ dist[j] = minPath + graph[startPos][j]; } } } } void findAns(int &minPath, int &pos) { //maxPath 表示从每个点开始到其他所有点的最长的路径 int dist[MAX_SIZE], i, j, maxPath; minPath = INF; for(i = 1; i <= numOfVertex; i++){ //cout<<endl<<i<<"入口: "; Dijkstra(i, dist); maxPath = -1; for(j = 1; j <= numOfVertex; j++){ // cout<<dist[j]<<" "; maxPath = max(maxPath, dist[j]); if(INF == maxPath) break; } //cout<<endl; //cout<<"maxPath: "<<maxPath; if(minPath > maxPath){ minPath = maxPath; pos = i; } } } int main() { //freopen("in.txt", "r", stdin); int i, j, nextVertex, weight, numOfNext, minPath, minStartPos; while(cin>>numOfVertex){ if(numOfVertex == 0) break; memset(graph, 0, sizeof(graph)); minPath = INF; //initialize the graph for(i = 1; i <= numOfVertex; i++){ scanf("%d", &numOfNext); while(numOfNext--){ scanf("%d %d", &nextVertex, &weight); graph[i][nextVertex] = weight; } } findAns(minPath, minStartPos); if(minPath != INF){ printf("%d %d\n", minStartPos, minPath); } else{ printf("disjoint\n"); } } return 0; }Floyd算法
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_SIZE = 128, INF = 1<<29; int numOfVertex; int graph[MAX_SIZE][MAX_SIZE]; void Floyd() { int i, j, k; for(k = 1; k <= numOfVertex; k++) for(i = 1; i <= numOfVertex; i++) for(j = 1; j <= numOfVertex; j++) if(graph[i][j] > graph[i][k] + graph[k][j]) graph[i][j] = graph[i][k] + graph[k][j]; } void findAns(int &path, int &pos) { int i, j, maxPath; for(i = 1; i <= numOfVertex; i++){ maxPath = -1; for(j = 1; j <= numOfVertex; j++){ maxPath = max(maxPath, graph[i][j]); if(INF == maxPath) break; } if(path > maxPath){ path = maxPath; pos = i; } } } int main() { // freopen("in.txt", "r", stdin); int i, j, nextVertex, weight, numOfNext, minPath, minStartPos; while(cin>>numOfVertex){ if(numOfVertex == 0) break; for(i = 0; i <= numOfVertex; i++) for(j = 0; j <= numOfVertex; j++) if(i != j) graph[i][j] = INF; else graph[i][j] = 0; minPath = INF; //initialize the graph for(i = 1; i <= numOfVertex; i++){ scanf("%d", &numOfNext); while(numOfNext--){ scanf("%d %d", &nextVertex, &weight); graph[i][nextVertex] = weight; } } Floyd(); findAns(minPath, minStartPos); if(minPath != INF){ printf("%d %d\n", minStartPos, minPath); } else{ printf("disjoint\n"); } } return 0; }