[BZOJ3890] [Usaco 2015 Jan] 미팅 타임 토폴로지 단순DP
#include <stdio.h>
int main()
{
puts(" [vmurder] ");
puts(" :blog.csdn.net/vmurder/article/details/43971435");
}
제목:
n개의 점 m변의 유방향 무환도를 제시하고 각 변의 두 변권을 제시한다.n<=100, 무거운 테두리가 없습니다.그리고 두 개의 길이가 같고 가능한 한 짧은 경로를 요구한다. 경로 1은 첫 번째 변권을 사용하고 경로 2는 두 번째 변권을 사용한다.없으면 내보내기
문제 풀이:
단순 토폴로지 DPbool형 수조 f[i][j], g[i][j]는 i번째 점에 1이 점의 권한 값이 j인 경로 1, 2가 있는지 여부를 나타낸다.
코드:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 105
using namespace std;
bool f[N][N*N],g[N][N*N];
int map1[N][N],map2[N][N];
int n,m,stk[N],top,d[N];
int main()
{
// freopen("test.in","r",stdin);
int i,j,k;
int a,b,c;
memset(map1,-1,sizeof map1);
memset(map2,-1,sizeof map2);
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&k);
map1[a][b]=c,map2[a][b]=k,d[b]++;
}
for(i=1;i<=n;i++)if(!d[i])stk[++top]=i;
f[1][0]=g[1][0]=1;
while(top)
{
a=stk[top--];
for(i=1;i<=n;i++)if(map1[a][i]+1)
{
if(--d[i]==0)stk[++top]=i;
for(j=map1[a][i];j<=10000;j++)f[i][j]|=f[a][j-map1[a][i]];
for(j=map2[a][i];j<=10000;j++)g[i][j]|=g[a][j-map2[a][i]];
}
}
for(i=0;i<=10000;i++)
{
if(f[n][i]&g[n][i])
{
printf("%d
",i);
return 0;
}
}
puts("IMPOSSIBLE");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.