Submission #342896

#TimeUsernameProblemLanguageResultExecution timeMemory
342896leinad2Graph (BOI20_graph)C++17
100 / 100
204 ms24036 KiB
#include<bits/stdc++.h>
using namespace std;
int n, m, i, j, k, a, b, c, vis[100010], A[100010][2];
vector<pair<int, int> >adj[100010];
double ans[100010];
bool flag=true;
vector<double>V;
vector<int>chk;
void dfs(int v)
{
    chk.push_back(v);
    for(int i=0;i<adj[v].size();i++)
    {
        int p=adj[v][i].first;
        if(!vis[p])
        {
            vis[p]=1;
            A[p][0]=-A[v][0];
            A[p][1]=adj[v][i].second-A[v][1];
            dfs(p);
        }
        else
        {
            if(A[p][0]==A[v][0])
            {
                V.push_back((double)(adj[v][i].second-A[p][1]-A[v][1])/(A[p][0]+A[v][0]));
            }
            else
            {
                if(A[p][1]+A[v][1]!=adj[v][i].second)
                {
                    flag=false;
                }
            }
        }
    }
}
int main()
{
    for(scanf("%d %d", &n, &m);i++<m;)
    {
        scanf("%d %d %d", &a, &b, &c);
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    for(i=0;i++<n;)
    {
        if(!vis[i])
        {
            V.clear();
            chk.clear();
            vis[i]=1;
            A[i][0]=1;
            A[i][1]=0;
            dfs(i);
            if(flag==false)
            {
                puts("NO");
                return 0;
            }
            if(V.size())
            {
                for(j=1;j<V.size();j++)
                {
                    if(V[j]!=V[0])
                    {
                        puts("NO");
                        return 0;
                    }
                }
                for(j=0;j<chk.size();j++)
                {
                    k=chk[j];
                    ans[k]=(double)A[k][0]*V[0]+(double)A[k][1];
                }
            }
            else
            {
                vector<int>v;
                for(j=0;j<chk.size();j++)
                {
                    k=chk[j];
                    v.push_back(-(A[k][1]/A[k][0]));
                }
                sort(v.begin(), v.end());
                double a=(double)(v[v.size()/2]);
                for(j=0;j<chk.size();j++)
                {
                    k=chk[j];
                    ans[k]=a*(double)A[k][0]+(double)A[k][1];
                }
            }
        }
    }
    puts("YES");
    for(i=0;i++<n;)printf("%.10lf ", ans[i]);
}

Compilation message (stderr)

Graph.cpp: In function 'void dfs(int)':
Graph.cpp:12:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     for(int i=0;i<adj[v].size();i++)
      |                 ~^~~~~~~~~~~~~~
Graph.cpp: In function 'int main()':
Graph.cpp:63:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<double>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |                 for(j=1;j<V.size();j++)
      |                         ~^~~~~~~~~
Graph.cpp:71:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |                 for(j=0;j<chk.size();j++)
      |                         ~^~~~~~~~~~~
Graph.cpp:80:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |                 for(j=0;j<chk.size();j++)
      |                         ~^~~~~~~~~~~
Graph.cpp:87:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |                 for(j=0;j<chk.size();j++)
      |                         ~^~~~~~~~~~~
Graph.cpp:40:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   40 |     for(scanf("%d %d", &n, &m);i++<m;)
      |         ~~~~~^~~~~~~~~~~~~~~~~
Graph.cpp:42:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   42 |         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...