結果
問題 | 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 1000000000 int 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"); } }