# 다익스트라 알고리즘
# 실수 했던 점
기본적으로 다익스트라 알고리즘은 각 방문지의 값을 INF로 초기화 시켜놔야 하는데
초기화를 안했다.
이문제의 경우 -INF로 해야한다
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <utility>
#include <climits>
#include <functional>
#define MAX 1005
#define INF 987654321
#define MOD 1000000
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pi;
typedef pair<float, float> pf;
int n,a,b,c,d;
int arr[MAX][MAX],djk[MAX];
bool tf[MAX];
vector<pi> v;
int find_next()
{
int ret=-1,val=-INF;
for(int i=1;i<=n;i++)
if(tf[i]==false&&djk[i]>val)
{
val=djk[i];
ret=i;
}
return ret;
}
int main() {
fill_n(&djk[0],MAX,-INF);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&arr[i][j]);
scanf("%d%d",&a,&b);
for(int i=0;i<a;i++)
{
scanf("%d%d",&c,&d);
djk[c]=d;
}
for(int i=0;i<b;i++)
{
scanf("%d%d",&c,&d);
v.push_back(make_pair(c, d));
}
int tmp=find_next();
while(tmp!=-1)
{
tf[tmp]=true;
for(int i=1;i<=n;i++)
if(arr[tmp][i]!=0&&djk[i]<djk[tmp]-arr[tmp][i])
djk[i]=djk[tmp]-arr[tmp][i];
tmp=find_next();
}
int ans=-INF;
for(int i=0;i<v.size();i++)
if(ans<djk[v[i].first]+v[i].second)
ans=djk[v[i].first]+v[i].second;
printf("%d",ans);
return 0;
}'IT > BOJ' 카테고리의 다른 글
| 백준(BOJ) 13547 수열과 쿼리5 *** (0) | 2018.06.28 |
|---|---|
| 백준(BOJ) 15807 빛영우 *** (0) | 2018.06.28 |
| 백준(BOJ) 10800 컬러볼 ** (0) | 2018.06.28 |
| 백준(BOJ) 9935 문자열 폭발 ** (0) | 2018.06.28 |
| 백준(BOJ) 3392 화성지도 *** (0) | 2018.06.22 |