提出 #60130355
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef double DOUBLE;
typedef complex<double> point;
#define xx real()
#define yy imag()
#define REP(i, a, b) for(int i = (a); i < (int)(b); i++)
#define REPN(i, a, b) for(int i = (a); i <= (int)(b); i++)
#define FA(it, x) for(__typeof((x).begin()) it = (x).begin(); it != (x).end(); it++)
#define SZ(x) (int)(x).size()
#define BE(x) (x).begin(), (x).end()
#define SORT(x) sort(BE(x))
#define _1 first
#define _2 second
#define x0 gray_cat_x0
#define y0 gray_cat_y0
#define x1 gray_cat_x1
#define y1 gray_cat_y1
#define j0 gray_cat_j0
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define file "I1"
const double EPS = 1e-9;
const double PI = acos(-1.);
const ll LL_INF = 1e17 + 16;
const int INF = 1e9 + 10;
// const ll MOD = 1e9 + 7;
const ll MOD = 998244353;
// Graph solving 2-SAT problem
// Works in O(n + m)
// Use:
// 1) Fill gg.n as number of variables (not number of vertices!!!!
// Number of vertices will be gg.n * 2)
// 2) Call gg.add_clause(a, val_a, b, val_b) for each clause.
// For example, for clause !v[i] | v[j] call gg.add_clause(i, 0, j, 1)
// 3) Call gg.build()
// If gg.IsSatisfiable is false there is no solution
// Otherwise answer will be in boolean array gg.result
// Note number of vertices will be twice more than number of variables
const int MAXN = 1e6 + 5;
struct graph{
// Number of variables (number of vertices will be 2 * n)
int n;
// Graph
vi g[MAXN];
// Reverse graph
vi gr[MAXN];
// For dfs
char used[MAXN];
// For topological sorting
vector<int> sorted;
// Indices of condensation components for vertices
int col[MAXN];
// Current condensation component index
int cur_col;
// If has solution
bool IsSatisfiable;
bool result[MAXN];
void clear(){
for(int i = 0; i < 2 * n; i++){
g[i].clear();
gr[i].clear();
}
n = 0;
}
// Add edge (process clause (a | b) where val_a indicates whether we use a or !a)
void add_clause(int a, int val_a, int b, int val_b){
g[(a << 1) ^ val_a ^ 1].pb((b << 1) ^ val_b);
gr[(b << 1) ^ val_b].pb((a << 1) ^ val_a ^ 1);
g[(b << 1) ^ val_b ^ 1].pb((a << 1) ^ val_a);
gr[(a << 1) ^ val_a].pb((b << 1) ^ val_b ^ 1);
}
// Dfs with top sorting
void dfs(int s){
used[s] = 1;
for(int i = 0; i < (int)g[s].size(); i++){
int to = g[s][i];
if (!used[to]){
dfs(to);
}
}
sorted.push_back(s);
}
// DFS in reverse graph
void dfs_r(int s){
used[s] = 1;
col[s] = cur_col;
for(int i = 0; i < (int)gr[s].size(); i++){
int to = gr[s][i];
if (!used[to]){
dfs_r(to);
}
}
}
// Building condensation
void get_condensation(){
// Init
for(int i = 0; i < 2 * n; i++){
used[i] = 0;
}
sorted.clear();
// First DFS series
for(int i = 0; i < 2 * n; i++){
if (!used[i]){
dfs(i);
}
}
// Init
for(int i = 0; i < 2 * n; i++){
used[i] = 0;
}
cur_col = 0;
// Second DFS series
for(int i = 2 * n - 1; i >= 0; i--){
int s = sorted[i];
if (!used[s]){
cur_col++;
dfs_r(s);
}
}
}
void build(){
// Get condensation
get_condensation();
// Find satisfability
IsSatisfiable = true;
for(int i = 0; i < 2 * n; i += 2){
if (col[i] == col[i ^ 1]){
IsSatisfiable = false;
break;
}
if (col[i] > col[i ^ 1]){
result[i / 2] = false;
} else {
result[i / 2] = true;
}
}
}
};
graph gg;
char ans[MAXN];
void solve(){
int n, m, a, b, c;
scanf("%d%d", &n, &m);
// TODO: set gg.n
gg.n = 2 * n;
REP(i, 0, m) {
scanf("%d%d%d", &a, &b, &c);
a--, b--;
if (c == 0) {
//gg.add_clause(2 * a, 1, 2 * b + 1, 1);
//gg.add_clause(2 * a, 0, 2 * b + 1, 0);
gg.add_clause(2 * a, 0, 2 * b + 1, 1);
gg.add_clause(2 * a, 1, 2 * b + 1, 0);
} else {
//gg.add_clause(2 * a, 1, 2 * b + 1, 0);
//gg.add_clause(2 * a, 0, 2 * b + 1, 1);
gg.add_clause(2 * a, 0, 2 * b + 1, 0);
gg.add_clause(2 * a, 1, 2 * b + 1, 1);
}
}
gg.build();
if (!gg.IsSatisfiable) {
printf("-1\n");
return;
}
REP(i, 0, n) {
bool is_1 = (gg.result[2 * i] && !gg.result[2 * i + 1]);
bool is_3 = (!gg.result[2 * i] && gg.result[2 * i + 1]);
if (is_1 || is_3) {
ans[i] = '1';
} else {
ans[i] = '0';
}
}
printf("%s\n", ans);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
//freopen(file".in", "r", stdin); freopen(file".out", "w", stdout);
int t = 1;
//cin >> t;
while(t--){
solve();
}
}
提出情報
コンパイルエラー
Main.cpp: In function ‘void solve()’:
Main.cpp:183:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
183 | scanf("%d%d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:187:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
187 | scanf("%d%d%d", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
700 / 700 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample-01.txt, sample-02.txt, sample-03.txt |
| All |
in-01.txt, in-02.txt, in-03.txt, in-04.txt, in-05.txt, in-06.txt, in-07.txt, in-08.txt, in-09.txt, in-10.txt, in-11.txt, in-12.txt, in-13.txt, in-14.txt, in-15.txt, in-16.txt, in-17.txt, in-18.txt, in-19.txt, in-20.txt, in-21.txt, in-22.txt, in-23.txt, in-24.txt, in-25.txt, in-26.txt, in-27.txt, in-28.txt, in-29.txt, in-30.txt, in-31.txt, in-32.txt, in-33.txt, in-34.txt, in-35.txt, in-36.txt, in-37.txt, in-38.txt, sample-01.txt, sample-02.txt, sample-03.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| in-01.txt |
AC |
22 ms |
50696 KiB |
| in-02.txt |
AC |
22 ms |
50484 KiB |
| in-03.txt |
AC |
22 ms |
50600 KiB |
| in-04.txt |
AC |
22 ms |
50828 KiB |
| in-05.txt |
AC |
305 ms |
87980 KiB |
| in-06.txt |
AC |
255 ms |
80764 KiB |
| in-07.txt |
AC |
223 ms |
75520 KiB |
| in-08.txt |
AC |
286 ms |
83916 KiB |
| in-09.txt |
AC |
263 ms |
89804 KiB |
| in-10.txt |
AC |
277 ms |
89800 KiB |
| in-11.txt |
AC |
276 ms |
89784 KiB |
| in-12.txt |
AC |
281 ms |
89816 KiB |
| in-13.txt |
AC |
262 ms |
89076 KiB |
| in-14.txt |
AC |
277 ms |
88976 KiB |
| in-15.txt |
AC |
279 ms |
89052 KiB |
| in-16.txt |
AC |
52 ms |
60668 KiB |
| in-17.txt |
AC |
166 ms |
70220 KiB |
| in-18.txt |
AC |
133 ms |
67592 KiB |
| in-19.txt |
AC |
55 ms |
56388 KiB |
| in-20.txt |
AC |
108 ms |
62996 KiB |
| in-21.txt |
AC |
52 ms |
55652 KiB |
| in-22.txt |
AC |
249 ms |
83860 KiB |
| in-23.txt |
AC |
95 ms |
65428 KiB |
| in-24.txt |
AC |
44 ms |
55096 KiB |
| in-25.txt |
AC |
32 ms |
58080 KiB |
| in-26.txt |
AC |
33 ms |
58132 KiB |
| in-27.txt |
AC |
32 ms |
58232 KiB |
| in-28.txt |
AC |
61 ms |
58168 KiB |
| in-29.txt |
AC |
64 ms |
58428 KiB |
| in-30.txt |
AC |
63 ms |
58336 KiB |
| in-31.txt |
AC |
59 ms |
58096 KiB |
| in-32.txt |
AC |
61 ms |
58092 KiB |
| in-33.txt |
AC |
43 ms |
55488 KiB |
| in-34.txt |
AC |
111 ms |
67156 KiB |
| in-35.txt |
AC |
29 ms |
53504 KiB |
| in-36.txt |
AC |
49 ms |
56892 KiB |
| in-37.txt |
AC |
79 ms |
64888 KiB |
| in-38.txt |
AC |
31 ms |
57320 KiB |
| sample-01.txt |
AC |
22 ms |
50600 KiB |
| sample-02.txt |
AC |
22 ms |
50644 KiB |
| sample-03.txt |
AC |
22 ms |
50600 KiB |