2-1. 근데 양방향이므로 이미 방문한 노드에 대해 중복하지 못하도록 하면 만약 다른 길을 거쳐 같은 노드로 오는 다른 경우의 cost합이 더 클 경우를 반영하지 못한다.
2-2. 2-1을 보완하기 위해 다른 방법을 쓰면 양방향이므로 무한 실행을 하게된다.
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
int V;
bool isFirst;
vector<pair<int, int>> graph[100001];
int isVisited[100001] = { 0 };
long long maxVal = -1e9;
int maxNode = -1;
void dfs(int src, long long totalCost)
{
if (isVisited[src] == 1)
return;
if (maxVal < totalCost)
{
maxVal = totalCost;
maxNode = src;
}
isVisited[src] = 1;
int size = graph[src].size();
for (int i = 0; i < size; i++)
{
int curDst = graph[src][i].first;
long long curCost = graph[src][i].second;
totalCost += curCost;
dfs(curDst, totalCost);
totalCost -= curCost;
}
}
int main()
{
cin >> V;
for (int i = 0; i < V; i++)
{
isFirst = false;
int src;
cin >> src;
queue<int> qq;
while (1)
{
int num;
cin >> num;
if (num == -1)
break;
qq.push(num);
}
int size = qq.size() / 2;
for (int j = 0; j < size; j++)
{
int n = qq.front();
qq.pop();
int cost = qq.front();
qq.pop();
graph[src].push_back({ n,cost });
}
}
dfs(1, 0);
memset(isVisited, 0, sizeof(isVisited));
maxVal = -1;
dfs(maxNode, 0);
cout << maxVal;
return 0;
}