https://www.acmicpc.net/problem/15971 두 로봇의 위치 사이의 거리에서 가장 큰 비용의 간선을 빼주면 된다. 그러면 최소 비용으로 양쪽에서 오다가 서로 만날 수 있다. 12345678910111213141516171819202122232425262728293031323334353637383940#include #include #include using namespace std; int n,s,e,u,v,w,c[100001],ans,f;vector a[100001]; void dfs(int now,int cost,int mcost){ c[now]=true; if(f) return; if(now==e) { f=1; ans=cost-mcost; return; } for(auto i..
https://www.acmicpc.net/problem/11723 비트마스크를 이용해서 집합 연산을 하는 문제이다. 예를 들어 1을 원소로 가지고 있다면 10, 2를 가지고 있다면 100, 1~5를 가지고 있다면 111110이다. 시프트 연산자를 이용해서 다양한 연산을 할 수 있다. add: x만큼 왼쪽으로 민 것과 OR 연산을 한다. 원소가 이미 존재하면 그대로 1일 것이고 없다면 1로 바뀌어서 추가된다.remove: x만큼 왼쪽으로 민 것을 반전시켜주고 AND 연산을 한다. 그러면 삭제하고자 하는 위치는 무조건 0이 되고 나머지 부분은 유지된다.check: x만큼 왼쪽으로 민 것과 AND 연산을 해서 그대로 유지되면 x가 있는 것이고 0이 되면 x가 없는 것이다.toggle: x만큼 왼쪽으로 민 것..
https://www.acmicpc.net/problem/2098 d[i][j] = 마지막 방문 도시가 i이면서 방문 상태가 j일 때 최소 비용 방문 상태를 비트마스크를 이용해서 정수 하나로 효율적으로 나타낼 수 있다. 시간 복잡도는 O(N^2*2^N)이다. 123456789101112131415161718192021222324252627282930313233#include #include #include #define INF 987654321using namespace std; int n,w[16][16],d[16][1
https://www.acmicpc.net/problem/11562 플로이드를 돌려서 어찌어찌 해야할 것 같다. 약간의 트릭을 주면 된다. u,v,b를 받아서 양방향 간선이면 d[u][v]=d[v][u]=0, 단방향 간선이면 d[u][v]=0,d[v][u]=1로 줘서 양방향 간선으로 만들어 준다. 그리고 플로이드를 돌리면 모든 정점 사이에 대해서 최소 몇 개의 일방통행인 길을 양방향 통행으로 바꿔야 하는지 알 수 있다. 123456789101112131415161718#include #include #define INF 987654321using namespace std; int n,m,u,v,b,k,s,e,i,j,d[300][300]; int main(){ scanf("%d %d",&n,&m); for..