Submission #300429

#TimeUsernameProblemLanguageResultExecution timeMemory
300429bacegen4oGraph (BOI20_graph)C11
100 / 100
189 ms12792 KiB
#pragma GCC optimize "-O3"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<assert.h>
#include<stdbool.h>
#include<limits.h>
int cmp(const void * a, const void * b){ return ( *(int*)a - *(int*)b ); }
typedef struct{
  int first, second;
}pair;
pair newpair(int a, int b){
  return(pair){a,b};
}
#define pbp(zpv, zvv) zpv.ptr = pushbackP(zpv.ptr, &zpv.sz, zvv)
#define resizeArray(ptr, type, size) ((type*)realloc(ptr, (size) * sizeof(type)))
pair*pushbackP(pair*array, int*size, pair value){
  pair*output = resizeArray(array, pair, *size + 1);
  output[(*size)++] = value;
  return output;
}
typedef struct{
	pair*ptr;
	int sz;
}vecp;
vecp newVecP(){
	vecp rez;
	rez.ptr = NULL;
	rez.sz  = 0;
	return rez;
}
#if 1 //queueue
typedef int QueueElementType;
typedef struct Queue
{
  QueueElementType  *Elements;
  int  Front;
  int  Back;
  int  NumElements;
  int  Capacity;
} Queue;
Queue *newQueue();
void   DeleteQueue(Queue *Q);
int    empty(Queue *Q);
int    push(Queue *Q, QueueElementType e);
QueueElementType pop(Queue *Q);
int    isElementInQueue(Queue *Q, QueueElementType e);

Queue *newQueue()
{
  int N=1024;
  Queue *Q;
  if (N < 1)
  {
    printf("\n**Error in newQueue invalid parameter N (%d)\n\n", N);
    return NULL;
  }
  Q = (Queue *)malloc(sizeof(Queue));
  if (Q == NULL)
  {
    printf("\n**Error in newQueue: malloc failed _to allocate\n\n");
    exit(-1);
  }
  Q->Elements = (QueueElementType *)malloc(N * sizeof(QueueElementType));
  if (Q->Elements == NULL)
  {
    printf("\n**Error in newQueue: malloc failed _to allocate\n\n");
    exit(-1);
  }
  Q->Front = 0;
  Q->Back = -1;
  Q->NumElements = 0;
  Q->Capacity = N;
  return Q;
}
void DeleteQueue(Queue *Q)
{
  free(Q->Elements);
  free(Q);
}
int empty(Queue *Q)
{
  return Q->NumElements == 0;
}
int size(Queue *Q)
{
  return Q->NumElements;
}
int push(Queue *Q, QueueElementType e)
{
  if (Q->NumElements == Q->Capacity)
  {
    int N = 2 * Q->Capacity;
    QueueElementType *newE = (QueueElementType *)malloc(N * sizeof(QueueElementType));
    if (newE == NULL)
    {
      printf("\n**Error in push: malloc failed _to allocate\n\n");
      exit(-1);
    }
    int  i = Q->Front;
    int  j = 0;
    int  n;
    for (n = 0; n < Q->NumElements; ++n)
    {
      newE[j] = Q->Elements[i];
      ++j;
      ++i;
      if (i >= Q->Capacity)
        i = 0;
    }
    free(Q->Elements);
    Q->Front = 0;
    Q->Back = j - 1;
    Q->Elements = newE;
    Q->Capacity = N;
  }
  Q->Back++;
  if (Q->Back >= Q->Capacity)
    Q->Back = 0;
  Q->Elements[Q->Back] = e;
  Q->NumElements++;
  return 1;
}
QueueElementType pop(Queue *Q)
{
  if (empty(Q))
  {
    printf("\n**Error in pop: Q is empty?!\n\n");
    exit(-1);
  }
  QueueElementType e = Q->Elements[Q->Front];
  Q->Front++;
  if (Q->Front >= Q->Capacity)
    Q->Front = 0;
  Q->NumElements--;
  return e;
}
QueueElementType front(Queue *Q)
{
  if (empty(Q))
  {
    printf("\n**Error in pop: Q is empty?!\n\n");
    exit(-1);
  }
  QueueElementType e = Q->Elements[Q->Front];
  return e;
}
#endif
//////////////////////////
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
//typedef pair<int,int> pii;
//typedef vector<vector<int> > graph;
//const double pi = acos(-1.0);
#define oned(a, x1, x2) { cout << #a << ":"; for(int _i = (x1); _i < (x2); _i++){ cout << " " << a[_i]; } cout << endl; }
#define twod(a, x1, x2, y1, y2) { cout << #a << ":" << endl; for(int _i = (x1); _i < (x2); _i++){ for(int _j = (y1); _j < (y2); _j++){ cout << (_j > y1 ? " " : "") << a[_i][_j]; } cout << endl; } }
#define mp make_pair
#define pb push_back
#define fst first
#define snd second
enum{MAXN = 200005};
int n, m;
vecp g[MAXN];
int vis[MAXN];
int sgn[MAXN];
int val[MAXN];
Queue*Q;
int ans[MAXN];
int cnt;
int comp[MAXN];
int num[MAXN];

void solve(){
    memset(vis,0,sizeof(vis));
    for(int u = 1; u <= n; u++) {
        if(!vis[u]) {
            vis[u] = true;
            sgn[u] = +1;
            val[u] = 0;
            cnt = 0;
            comp[cnt++] = u;
            bool bip = true;
            double x;
            push(Q, u);
            while(!empty(Q)) {
                int v = front(Q); pop(Q);
                for(size_t i = 0; i < g[v].sz; i++){
                    int w   = g[v].ptr[i].fst;
                    int sum = g[v].ptr[i].snd;
                    if(!vis[w]){
                        vis[w] = true;
                        sgn[w] = -sgn[v];
                        val[w] = sum-val[v];
                        comp[cnt++] = w;
                        push(Q, w);
                    }
                    else if(sgn[w]==sgn[v]) {
                        bip = false;
                        x = sgn[w]*(sum-val[w]-val[v])/2;
                    }
                }
            }
            if(bip) {
                for(int i = 0; i < cnt; i++) {
                    int v = comp[i];
                    num[i] = (-sgn[v])*val[v];
                }
                qsort(num, cnt, sizeof(int), cmp);
                x = num[cnt/2];
            }
            for(int i = 0; i < cnt; i++) {
                int v = comp[i];
                ans[v] = val[v] + sgn[v]*x;
            }
            for(int i = 0; i < cnt; i++) {
                int v = comp[i];
                for(size_t i = 0; i < g[v].sz; i++){
                    int w = g[v].ptr[i].fst;
                    if(ans[v]+ans[w]!=g[v].ptr[i].snd){
                        puts("NO");
                        return;
                    }
                }
            }
        }
    }
    puts("YES");
    for(int v = 1; v <= n; v++){
        printf("%.1lf ", 0.5*ans[v]);
    }
    puts("");
}
int main(){
    Q=newQueue();
    while(scanf("%d %d", &n, &m)==2){
        for(int i = 1; i <= n; i++){
            g[i].sz=0;
        }
        for(int i = 0; i < m; i++){
            int a, b, c;
            scanf("%d %d %d", &a, &b, &c);
            c *= 2;
            pbp(g[a], newpair(b,c));
            pbp(g[b], newpair(a,c));
        }
        solve();
    }
    return 0;
}

Compilation message (stderr)

Graph.c: In function 'main':
Graph.c:243:13: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  243 |             scanf("%d %d %d", &a, &b, &c);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...