ACM队内训练第六周的专题是图论中最短路径问题,今晚终于把五道题目都AC了,下面依次总结一下并奉上代码。
题目列表
对应poj题目 |
---|
poj1125 Stockbroker Grapevine |
poj3615 Cow Hurdles |
poj1847 Tram |
poj1502 MPI Maelstrom |
poj1860 Currency Exchange |
NO.1 poj1125 Stockbroker Grapevine
题目给定一个有向图,求解最短路径,要求输出作为源的顶点坐标以及该顶点到达某个顶点的最大权值。数据量100,使用Floyd算法,复杂度为n^3。无特殊处理。
/*最短路径算法-Floyd算法*/
#include <iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<list>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
#define maxn 0x3f3f3f3f
struct Graph{ //邻接矩阵表示法
int arcs[105][105];
}g;
struct ShortPath{
int a[105][105];
}path;
void floyd(int n){
for(int i=0 ; i<n ; i++) //初始化
for(int j=0 ; j<n ; j++)
path.a[i][j] = g.arcs[i][j];
for(int k=0 ; k<n ; k++)
for(int i=0 ; i<n ; i++)
for(int j=0 ; j<n ; j++){
if(path.a[i][k]>=maxn || path.a[k][j]>=maxn)
continue;
if(path.a[i][j] > (path.a[i][k] + path.a[k][j]))
path.a[i][j] = path.a[i][k] + path.a[k][j];
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(cin>>n && n!=0){
int m,j;
memset(g.arcs,maxn,sizeof(g.arcs));
for(int i=0 ; i<n ; i++)
g.arcs[i][i]=0;
for(int i=0 ; i<n ; i++){
cin>>m;
while(m--){
cin>>j;
cin>>g.arcs[i][j-