HDU 1317 XYZZY Bellman - ford 최 장 로 판단 정 환 구하 기
한 방 에 도착 할 때마다 에너지 x 를 얻 을 수 있 습 니 다 (0 보다 작 을 수 있 습 니 다) 한 방 에 도착 할 때마다 총 에 너 지 는 0 이상 이 어야 한다. 방 마다 반복 해서 도착 할 수 있다.
사고방식: 1 에서 n 까지 의 가장 긴 길 을 구하 지만 정 환 이 정 환 이 없 으 면 가장 긴 길 을 직접 구 할 수 있 습 니 다. 만약 에 정 환 이 있 으 면 링 중의 점 이 n 에 도달 할 수 있 는 지 판단 할 수 있 습 니 다.
구체 적 으로 Bellman - ford 알고리즘 을 사용 하면 복잡 도 는 (n * m) 이지 만 이 문 제 는 괜 찮 을 것 같 습 니 다.
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 110;
struct edge
{
int u, v, w;
};
vector <edge> G;
int dis[maxn];
bool vis[maxn];
int n, m;
int a[maxn][maxn];
void floyd()
{
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
a[i][j] = a[i][j] || (a[i][k] && a[k][j]);
}
bool Bellman_Ford()
{
for(int i = 1; i <= n; i++)
dis[i] = -999999999;
dis[1] = 100;
for(int i = 1; i < n; i++)
{
for(int j = 0; j < G.size(); j++)
{
edge e = G[j];
if(dis[e.v] < dis[e.u] + e.w && dis[e.u] + e.w > 0)
dis[e.v] = dis[e.u] + e.w;
}
}
//printf("%d
", dis[n]);
if(dis[n] > 0)
return true;
for(int i = 0; i < G.size(); i++)
{
edge e = G[i];
if(dis[e.v] < dis[e.u] + e.w && dis[e.u] + e.w > 0)
{
//puts("sss");
dis[e.v] = dis[e.u] + e.w;
if(a[e.v][n])
return true;
}
}
return false;
}
int main()
{
while(scanf("%d", &n) && n != -1)
{
//for(int i = 0; i <= n; i++)
G.clear();
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
{
int t, v, w;
scanf("%d %d", &w, &t);
while(t--)
{
scanf("%d", &v);
G.push_back((edge){i, v, w});
//G.push_back((edge){v, i, w});
a[i][v] = 1;
//a[v][i] = 1;
//G[v].push_back((edge){u, w});
}
}
floyd();
if(Bellman_Ford())
puts("winnable");
else
puts("hopeless");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.