최대 권 폐쇄 도 hdu 3879 Base Station 템 플 릿 이 있 습 니 다!
새로운 기술 이 휴대 전화 통신 시장 에 충격 을 주 고 있 는데 각 통신사 들 에 게 이것 은 기회 이자 도전 이다.THU 그룹 계열 의 CS & amp; T 통신 은 차세 대 통신 기술 혈전 의 전야 에 너무 많은 준비 작업 을 해 야 하 며, 사이트 하나만 선택 하면 전기 시장 연구, 사이트 측량, 최적화 등 프로젝트 를 완성 해 야 한다.초기 에 시장 조사 와 사이트 측량 을 한 후에 회 사 는 모두 N 개의 통신 신호 로 환 승 할 수 있 는 주 소 를 얻 었 다. 이런 주소 의 지리 적 위치 차이 로 인해 서로 다른 곳 에서 통신 환 승 소 를 건설 하 는 데 투입 해 야 하 는 비용 도 다르다. 다행히 전기 조사 후에 이런 것들 은 모두 이미 알 고 있 는 데이터 이다. i 번 째 통신 환 승 소 를 설립 하 는 데 필요 한 비용 은 Pi 이다.(1 ≤ i ≤ N). 또한 회 사 는 모든 기대 하 는 사용자 군 을 조사 하여 총 M 개 를 얻 었 습 니 다. i 번 째 사용자 군 에 대한 정 보 는 Ai, Bi 와 Ci 로 요약 합 니 다. 이 사용자 들 은 중계 역 Ai 와 중계 역 Bi 를 사용 하여 통신 을 하고 회 사 는 이익 을 얻 을 수 있 습 니 다. (1 ≤ i ≤ M, 1 ≤ Ai, Bi ≤ N) THU 그룹의 CS & T 회 사 는 선택 적 으로 일부 중계 역 (투입 원가) 을 설립 할 수 있 습 니 다.일부 사용자 에 게 서 비 스 를 제공 하고 수익 (수익 의 합) 을 얻 습 니 다. 그러면 최종 적 으로 설립 된 중계 역 을 어떻게 선택해 야 회사 의 순이익 이 가장 클 수 있 습 니까? (순이익 = 수익 의 합 - 투입 원가 의 합)
Input
입력 파일 의 첫 번 째 줄 에는 두 개의 정수 N 과 M 이 있 습 니 다. 두 번 째 줄 에는 N 개의 정수 가 있 습 니 다. 각 통신 중계 국 의 구축 원 가 를 설명 합 니 다. P1, P2,..., PN 순 입 니 다. 아래 M 줄, 두 번 째 줄 의 세 번 째 숫자 Ai, Bi 와 Ci 는 두 번 째 사용자 군의 정 보 를 설명 합 니 다. 모든 변 량 의 의 미 는 제목 설명 을 참조 할 수 있 습 니 다.
Output
프로그램 이 출력 파일 에 정 수 를 출력 하기 만 하면 회사 가 얻 을 수 있 는 최대 순이익 을 표시 합 니 다.
Sample Input
5 5
1 2 3 4 5
1 2 3
2 3 4
1 3 3
1 4 2
4 5 3
Sample Output
4
Hint
안 만들어 주 는 템 플 릿 이 뭐 가 틀 렸 어 요 orz 그리고 이 원 제 는 NOI 의........................................................................
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=100000;
const int maxe=1000000;
int sum,s,e,head[maxn],level[maxn],que[maxn];
struct node{
int w,to,next;
}edge[maxe];
void add(int u,int v,int c)
{
edge[sum].to=v;
edge[sum].w=c;
edge[sum].next=head[u];
head[u]=sum++;
edge[sum].to=u;
edge[sum].w=0;
edge[sum].next=head[v];
head[v]=sum++;
}
bool bfs()
{
memset(level,0,sizeof(level));
int p=0;
que[p++]=s;
level[s]=1;
for(int i=0;i<p;i++)
{
int temp=que[i];
for(int k=head[temp];k>-1;k=edge[k].next)
if(edge[k].w && (!level[edge[k].to])){
que[p++]=edge[k].to;
level[edge[k].to]=level[temp]+1;
}
}
return level[e];
}
int dfs(int now,int maxf)
{
if(now==e)return maxf;
int ret=0;
for(int i=head[now];i>-1 && ret<maxf; i=edge[i].next)
if(edge[i].w && (level[edge[i].to]==level[now]+1))
{
int temp=dfs(edge[i].to,min(maxf-ret,edge[i].w));
edge[i].w-=temp;
edge[i^1].w+=temp;
ret+=temp;
}
if(ret==0)level[now]=0;
return ret;
}
int dinic()
{
int ans=0;
while(bfs())ans+=dfs(s,inf);
return ans;
}
int main()
{
//freopen("cin.txt","r",stdin);
int n,m,x;
while(~scanf("%d%d",&n,&m)){
sum=0;
memset(head,-1,sizeof(head));
s=0,e=n+m+1;
for(int i=1;i<=n;i++){
scanf("%d",&x);
add(i+m,e,x);
}
int count=0;
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(i,a+m,inf);
add(i,b+m,inf);
add(s,i,c);
count+=c;
}
//cout<<dinic()<<endl;
printf("%d
",count-dinic());
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=100000;
const int maxe=1000000;
int sum,s,e,head[maxn],level[maxn],que[maxn];
struct node{
int w,to,next;
}edge[maxe];
void add(int u,int v,int c)
{
edge[sum].to=v;
edge[sum].w=c;
edge[sum].next=head[u];
head[u]=sum++;
edge[sum].to=u;
edge[sum].w=0;
edge[sum].next=head[v];
head[v]=sum++;
}
bool bfs()
{
memset(level,0,sizeof(level));
int p=0;
que[p++]=s;
level[s]=1;
for(int i=0;i<p;i++)
{
int temp=que[i];
for(int k=head[temp];k>-1;k=edge[k].next)
if(edge[k].w && (!level[edge[k].to])){
que[p++]=edge[k].to;
level[edge[k].to]=level[temp]+1;
}
}
return level[e];
}
int dfs(int now,int maxf)
{
if(now==e)return maxf;
int ret=0;
for(int i=head[now];i>-1 && ret<maxf; i=edge[i].next)
if(edge[i].w && (level[edge[i].to]==level[now]+1))
{
int temp=dfs(edge[i].to,min(maxf-ret,edge[i].w));
edge[i].w-=temp;
edge[i^1].w+=temp;
ret+=temp;
}
if(ret==0)level[now]=0;
return ret;
}
inline int dinic()
{
int ans=0;
while(bfs())ans+=dfs(s,inf);
return ans;
}
int main()
{
//freopen("cin.txt","r",stdin);
int n,m,x;
while(~scanf("%d%d",&n,&m)){
sum=0;
memset(head,-1,sizeof(head));
s=0,e=n+m+1;
for(int i=1;i<=n;i++){
scanf("%d",&x);
add(i+m,e,x);
}
int count=0;
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(i,a+m,inf);
add(i,b+m,inf);
add(s,i,c);
count+=c;
}
//cout<<dinic()<<endl;
printf("%d
",count-dinic());
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.