結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2015-04-15 01:16:54 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,780 bytes |
コンパイル時間 | 208 ms |
コンパイル使用メモリ | 25,216 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-04 14:31:40 |
合計ジャッジ時間 | 745 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:53:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 53 | scanf("%d %d",&W,&N); | ~~~~~^~~~~~~~~~~~~~~ main.cpp:55:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 55 | scanf("%d",&J[i]); | ~~~~~^~~~~~~~~~~~ main.cpp:57:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 57 | scanf("%d",&M); | ~~~~~^~~~~~~~~ main.cpp:59:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 59 | scanf("%d",&C0[i]); | ~~~~~^~~~~~~~~~~~~ main.cpp:62:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 62 | scanf("%d",&Q[i]); | ~~~~~^~~~~~~~~~~~ main.cpp:64:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 64 | scanf("%d",&X[i][j]); | ~~~~~^~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>#define INF 1000000000int n,g,C[102][102],F,f,m;int q[200],fr[102],qf,ql;void q_a(int a){q[ql] = a;ql++;}int q_t(void){qf++;return q[qf-1];}int min(int a,int b){if(a>b){return b;}else{return a;}}int bfs(void){int i,v,br;int rt = -1;qf = 0; ql = 0;q_a(0);for(i=0;i<n;i++){fr[i] = -1;}fr[0] = -2;br = 0;while(qf<ql){v = q_t();for(i=0;i<n;i++){if(C[v][i]>0 && fr[i]==-1){q_a(i);fr[i] = v;if(i==g){br = 1;rt = 1;}}}if(br == 1){break;}}return rt;}int main(void){int v,i,j,k;int W,N,J[50],M,C0[50],Q[50],X[50][50];scanf("%d %d",&W,&N);for(i=0;i<N;i++){scanf("%d",&J[i]);}scanf("%d",&M);for(i=0;i<M;i++){scanf("%d",&C0[i]);}for(i=0;i<M;i++){scanf("%d",&Q[i]);for(j=0;j<Q[i];j++){scanf("%d",&X[i][j]);}}n = N+M+2;/*0が始点。1,2,...,Nが原画、N+1,N+2,...,N+Mが作監、N+M+1が終点。始点とそれぞれの原画をJ[i]で結ぶ。合わない指定されていない原画と作監を、すべてINFで結ぶ。それぞれの作監と終点をC0[i]で結ぶ。*/for(i=0;i<N+M+2;i++){for(j=0;j<N+M+2;j++){C[i][j] = 0;}}for(i=0;i<N;i++){C[0][i+1] = J[i];}for(i=0;i<N;i++){for(j=0;j<M;j++){C[i+1][j+N+1] = INF;for(k=0;k<Q[j];k++){if(X[j][k] == i+1){C[i+1][j+N+1] = 0;}}}}for(i=0;i<M;i++){C[i+N+1][N+M+1] = C0[i];}g = N+M+1;F = 0;while(bfs()>0){v = g;m = INF;while(v != 0){m = min(C[fr[v]][v],m);v = fr[v];}f = m;F += f;v = g;while(v != 0){C[fr[v]][v] -= f;C[v][fr[v]] += f;v = fr[v];}}if(F<W){printf("BANSAKUTSUKITA\n");}else{printf("SHIROBAKO\n");}}