您的位置:首页 > 其它

POJ_1511_Invitation Cards(SPFA)

2013-10-14 14:52 246 查看
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

#define Max 1001
#define initVal -1
#define maxDist 101

int city1[Max][Max];
int city2[Max][Max];

bool visit1[Max];
bool visit2[Max];
int dist1[Max];
int dist2[Max];

int n; int m; int start;
queue< int > Q;

void init(){

memset( visit1, false, sizeof( visit1 ) );
memset( city1, initVal, sizeof( city1 ) );
memset( dist1, maxDist, sizeof( dist1 ) );
memset( visit2, false, sizeof( visit2 ) );
memset( city2, initVal, sizeof( city2 ) );
memset( dist2, maxDist, sizeof( dist2 ) );

int x, y;

for( int i = 0; i < m; ++i ){

cin >> x >> y;
cin >> city1[x][y];
city2[y][x] = city1[x][y];

}
}

void SPFA( int* dist, bool* visit, int city[Max][Max] ){

dist[start] = 0;
visit[start] = true;
Q.push( start );

while( !Q.empty() ){

int index = Q.front();
visit[index] = false;
Q.pop();

for( int i = 1; i <= n; ++i ){
if( city[index][i] != initVal && city[index][i] + dist[index] < dist[i] ){

dist[i] = city[index][i] + dist[index];

if(visit[i] == false){

visit[i] = true;
Q.push( i );

}
}
}
}
}

void show( int city[Max][Max] ){

for( int i = 1; i <= n; ++i ){

for( int j = 1; j <= n; ++j )
cout << city[i][j] << " ";

cout << endl;

}
}

int main(){

cin >> n >> m >> start;

init();
SPFA( dist1, visit1, city1 );
SPFA( dist2, visit2, city2 );

int mm = -1;

for( int i = 1; i <= n; ++i ){

dist1[i] += dist2[i];

if( mm < dist1[i] )
mm = dist1[i];

}

cout << mm << endl;

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: