2024年中国石油大学CG平台题解

注:本题解为个人题解,不保证完全正确(反正样例过了)

其中:个别题目我认为存在多测(和样例有出入);一个题目题干描述不清,我猜测后处理

      /*
      先放个能带来幸运的小猫:
      ⣿⣿⣿⠟⠛⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢋⣩⣉⢻
      ⣿⣿⣿⠀⣿⣶⣕⣈⠹⠿⠿⠿⠿⠟⠛⣛⢋⣰⠣⣿⣿⠀⣿
      ⣿⣿⣿⡀⣿⣿⣿⣧⢻⣿⣶⣷⣿⣿⣿⣿⣿⣿⠿⠶⡝⠀⣿
      ⣿⣿⣿⣷⠘⣿⣿⣿⢏⣿⣿⣋⣀⣈⣻⣿⣿⣷⣤⣤⣿⡐⢿
      ⣿⣿⣿⣿⣆⢩⣝⣫⣾⣿⣿⣿⣿⡟⠿⠿⠦⠀⠸⠿⣻⣿⡄⢻
      ⣿⣿⣿⣿⣿⡄⢻⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣾⣿⣿⣿⣿⠇⣼
      ⣿⣿⣿⣿⣿⣿⡄⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣰
      ⣿⣿⣿⣿⣿⣿⠇⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢀⣿
      ⣿⣿⣿⣿⣿⠏⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⣿
      ⣿⣿⣿⣿⠟⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣿
      ⣿⣿⣿⠋⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⣿
      ⣿⣿⠋⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸
      小猫保佑永远没有BUG!!!
      */
      Q1:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      stack<char> st;
      char e;

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while(cin>>e){
              cout<<e<<" ";
              st.push(e);
          }
          cout<<endl;
          while(!st.empty()){
              cout<<st.top()<<" ";
              st.pop();
          }

          return 0;
      }

      Q2:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 1005, MAX = 1e9, INF = -1e9;

      int x;
      int n,m;
      string a,b,c;
      vector<int> ans;
      queue<int> q;
      map<int,vector<int>> v;
      map<PII,string> e;
      map<PII,int> num;
      map<int,string> mp;
      map<string,int> rmp;
      int g1[N][N];
      int g2[N][N];
      int d[N];
      int ev[N];
      int lv[N];
      map<int,vector<int>> rv;
      void topsort(){
          for(int i =1;i<=n;i++){
              if(d[i]==0)q.push(i),ans.pb(i);
          }
          while(!q.empty()){
              int t=q.front();
              q.pop();
              for(auto i:v[t]){
                  d[i]--;
                  if(d[i]==0){
                      q.push(i);
                      ans.pb(i);
                  }
              }
          }
          for(auto i:ans){
              cout<<mp[i]<<" ";
          }
          cout<<endl;
          ans.clear();
          memset(d,0,sizeof d);
          return ;
      }

      void key(){
          memset(ev,0,sizeof ev);
          memset(lv,0x3f,sizeof lv);
          ev[1]=0;
          for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                  ev[j]=max(ev[j],ev[i]+g1[i][j]);
              }
          }
          lv[n]=ev[n];
          for(int i=n;i>=1;i--){
              for(int j=n;j>=1;j--){
                  lv[j]=min(lv[j],lv[i]-g1[j][i]);
              }
          }
          int l=0;
          for(int i=1;i<=n;i++){
              if(ev[i]==lv[i]&&l==0){
              l=i;
              }
              else if(ev[i]==lv[i]&&l!=0){
                  cout<<mp[l]<<" "<<mp[i]<<endl;
                  l=i;
              }
          }
          map<string,int> a;
          map<string,int> b;
          for(auto i:e){
              a[i.second]=ev[i.first.first];
              b[i.second]=lv[i.first.second]-num[i.first];
          }
          for(auto i:e){
              cout<<i.second<<" "<<a[i.second]<<" "<<b[i.second]<<endl;
          }
          int ls=0;
          l=0;
          for(int i=1;i<=n;i++){
              if(ev[i]==lv[i]&&l==0){
              l=i;
              }
              else if(ev[i]==lv[i]&&l!=0){
                  ls+=num[{l,i}];
                  l=i;
              }
          }
          cout<<ls<<endl;
          l=0;
          for(int i=1;i<=n;i++){
              if(ev[i]==lv[i]&&l==0){
              l=i;
              }
              else if(ev[i]==lv[i]&&l!=0){
                  cout<<e[{l,i}]<<" ";
                  l=i;
              }
          }
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n>>m;
          for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                  g2[i][j]=MAX;
                  g1[i][j]=INF;
              }
          }
          memset(d,0,sizeof d);
          for(int i=1;i<=n;i++){
              cin>>a;
              mp[i]=a;
              rmp[a]=i;
          }
          for(int i=1;i<=m;i++){
              cin>>a>>b>>c>>x;
              rv[rmp[b]].pb(rmp[a]);
              v[rmp[a]].pb(rmp[b]);
              e[{rmp[a],rmp[b]}]=c;
              num[{rmp[a],rmp[b]}]=x;
              g1[rmp[a]][rmp[b]]=x;
              g2[rmp[a]][rmp[b]]=x;
              d[rmp[b]]++;
          }
          topsort();
          key();
          
          return 0;
      }


      Q3:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      vector<int> v;
      int a,b,c;

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while(cin>>a){
              if(a==1){
                  cin>>b>>c;
                  v.insert(v.begin()+b-1,1,c);
              }
              else if(a==2){
                  cin>>b;
                  v.erase(v.begin()+b-1);
              }
              else{
                  for(auto i:v){
                      cout<<i<<" ";
                  }
                  cout<<endl;
              }
          }

          return 0;
      }

      Q4:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      vector<int> v;
      int e;int x;

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while(cin>>e){
              v.pb(e);
          }
          x=e;
          v.pop_back();
          for(auto i:v){
              cout<<i<<" ";
          }
          cout<<endl;
          for(auto i:v){
              if(i>=x)cout<<i<<" ";
          }
          
          return 0;
      }

      Q5:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string a;
      string b;
      map<int,int> mp1;
      map<int,int> mp2;
      map<int,int> ans;

      void pre_deal(){
          bool key=false;
          bool fg=false;
          int k;
          for(int i=0;i<a.size();i++){
              if(a[i]=='-'){
                  fg=true;
              }
              else if(key==false&&a[i]>='0'&&a[i]<='9'){
                  k=a[i]-'0';
                  if(fg){
                      k=-k;fg=false;
                  }
                  key=true;
              }
              else if(key==true&&a[i]>='0'&&a[i]<='9'){
                  int e=a[i]-'0';
                  if(fg){
                      e=-e;
                      fg=false;
                  }
                  key=false;
                  mp1[e]=k;
              }
          }
          key=false;
          fg=false;
          for(int i=0;i<b.size();i++){
              if(b[i]=='-'){
                  fg=true;
              }
              else if(key==false&&b[i]>='0'&&b[i]<='9'){
                  k=b[i]-'0';
                  if(fg){
                      k=-k;fg=false;
                  }
                  key=true;
              }
              else if(key==true&&b[i]>='0'&&b[i]<='9'){
                  int e=b[i]-'0';
                  if(fg){
                      e=-e;
                      fg=false;
                  }
                  key=false;
                  mp2[e]=k;
              }
          }
      }

      void solve(){
          pre_deal();
          for(auto i:mp1){
              ans[i.first]+=i.second;
          }

          for(auto i:mp2){
              ans[i.first]+=i.second;
          }
          stack<int> v;
          for(auto i:ans){
          if(i.second!=0){
              v.push(i.first);
              v.push(i.second);
          }
          }
          while(!v.empty()){
              cout<<v.top()<<" ";
              v.pop();
          }
          mp1.clear();mp2.clear();ans.clear();
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while(getline(cin,a)&&getline(cin,b)){
              solve();
              cout<<endl;
          }


          return 0;
      }

      Q6:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      vector<char> v;
      char e;
      int n=0;
      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while(cin>>e){
              v.pb(e);
              n++;
          }
          for(auto i:v){
              cout<<i<<" ";
          }
          cout<<endl;
          int l=0;int r=n-1;
          while(l<=r){
              if(v[l]!=v[r]){
                  cout<<"F"<<endl;
                  return 0;
              }
              l++;r--;
          }
          cout<<"T"<<endl;

          return 0;
      }

      Q7:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      int n;
      int a,b,c;
      map<int,int> lc;
      map<int,int> rc;
      bool st[N];
      int root;

      void dfs1(int x){
          cout<<x<<" ";
          if(lc.find(x)!=lc.end())dfs1(lc[x]);
          if(rc.find(x)!=rc.end())dfs1(rc[x]);
          if(lc.find(x)==lc.end()&&rc.find(x)==rc.end())return ;
      }

      void dfs2(int x){
          
          if(lc.find(x)!=lc.end())dfs2(lc[x]);
          cout<<x<<" ";
          if(rc.find(x)!=rc.end())dfs2(rc[x]);
          return ;
      }


      void dfs3(int x){
      
          if(lc.find(x)!=lc.end())dfs3(lc[x]);
          if(rc.find(x)!=rc.end())dfs3(rc[x]);
          cout<<x<<" ";
          return ;
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n;
          while(cin>>a>>b>>c){
              if(b!=0){
              st[b]=true;
              lc[a]=b;
              }
              if(c!=0){
              st[c]=true;
              rc[a]=c;
              }
          }
          for(int i=1;i<=n;i++){
              if(!st[i])root=i;
          }
          cout<<root<<endl;
          dfs1(root);
          cout<<endl;
          dfs2(root);
          cout<<endl;
          dfs3(root);
          return 0;
      }  

      Q8:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string m, n;

      void fun(string a, string b) {
          int t = b.find(a[0]);
          if (t != 0)
              fun(a.substr(1, t), b.substr(0, t));
          if (b.size() > t + 1)
              fun(a.substr(t + 1), b.substr(t + 1));
          cout << a[0];
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          while (cin >> m >> n) {
              fun(m, n);
              cout << endl;
          }

          return 0;
      }

      Q9:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      map<int,set<int>> mp;
      int a,b;
      int root;
      int n;
      map<int,int> deep;
      int maxd;

      void dfs(int x,int fa,int d){
          deep[d]++;
          maxd=max(maxd,d);
          if(mp[x].size()==1)return ;
          for(auto i:mp[x]){
              if(i!=fa){
                  dfs(i,x,d+1);
              }
          }
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n>>root;
          for(int i=1;i<=n-1;i++){
              cin>>a>>b;
              mp[a].insert(b);
              mp[b].insert(a);
          }
          dfs(root,0,1);
          for(auto i:deep){
              if(i.first!=maxd){
              if(i.second!=pow(2,i.first-1)){
                  cout<<"no"<<endl;
                  return 0;
              }
              }
          }
          cout<<"yes"<<endl;
          
          return 0;
      }

      Q10:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string s;
      int n;
      map<char,char> lc;
      map<char,char> rc;
      int num=1;

      void build(char x){
          if(num+1<=n&&s[num+1]!='.'){
              num++;
              lc[x]=s[num];
              build(s[num]);
          }
          else if(num+1<=n&&s[num+1]=='.'){
              num++;
          }
          if(num+1<=n&&s[num+1]!='.'){
              num++;
              rc[x]=s[num];
              build(s[num]);
          }
          else if(num+1<=n&&s[num+1]=='.'){
              num++;
          }
          return ;
      }

      void dfs3(char x){
      
          if(lc.find(x)!=lc.end())dfs3(lc[x]);
          if(rc.find(x)!=rc.end())dfs3(rc[x]);
          cout<<x;
          return ;
      }

      void dfs2(char x){
          
          if(lc.find(x)!=lc.end())dfs2(lc[x]);
          cout<<x;
          if(rc.find(x)!=rc.end())dfs2(rc[x]);
          return ;
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>s;n=s.size();
          s=" "+s;
          build(s[1]);
          dfs2(s[1]);
          cout<<endl;
          dfs3(s[1]);

          return 0;
      }

      Q11:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      int n;int e;
      vector<PII> v;
      map<PII,PII> lc;
      map<PII,PII> rc;
      PII root;
      string ans;
      map<int,string> ot;
      void dfs(PII x){
          if(lc.find(x)==lc.end()&&rc.find(x)==rc.end()){
              ot[x.first]=ans;
              return ;
          }

          ans+="1";
          dfs(lc[x]);
          ans.pop_back();
          ans+="0";
          dfs(rc[x]);
          ans.pop_back();
          
      }

      bool cmp(PII x,PII y){
          if(x.second!=y.second)return x.second>y.second;
          else return x.first<y.first;
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n;
          for(int i=1;i<=n;i++){
              cin>>e;
              v.pb({i,e});
          }
          while(v.size()>1){
              sort(v.begin(),v.end(),cmp);
              PII a=v.back();v.pop_back();
              PII b=v.back();v.pop_back();
              lc[{0,a.second+b.second}]=a;
              rc[{0,a.second+b.second}]=b;
              v.pb({0,a.second+b.second});
              root={0,a.second+b.second};
          }
          dfs(root);
          
          for(auto i:ot){
              cout<<i.second<<endl;
          }

          return 0;
      }

      Q12:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string s;
      int tag;
      int p[N];
      int num=1;
      bool key=false;

      void build(){
          int i=0;
          while(i<s.size()){
              if(s[i]=='#'){
                  p[num++]=-1;
                  i++;
              }
              else if(s[i]>='0'&&s[i]<='9'){
                  int e=0;
                  while(s[i]>='0'&&s[i]<='9'){
                      e=e*10+(s[i]-'0');
                      i++;
                  }
                  p[num++]=e;
                  e=0;
              }
              else i++;
          }
          num--;
      }

      void dfs(int x,int l){
          l+=p[x];
          if(2*x>num){
              if(tag==l)key=true;
              return ;
          }
          if(tag<l)return ;

          if(p[2*x]!=-1)dfs(2*x,l);
          if(p[2*x+1]!=-1)dfs(2*x+1,l);

      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          getline(cin,s);
          cin>>tag;
          build();

          dfs(1,0);
          cout<<(key ? "true" : "false")<<endl;

          return 0;
      }

      Q13:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string s;
      int p[N];
      map<int,int> mp;
      int num=1;

      void build(){
          int i=0;
          while(i<s.size()){
              if(s[i]=='#'){
                  p[num++]=-1;
                  i++;
              }
              else if(s[i]>='0'&&s[i]<='9'){
                  int e=0;
                  while(s[i]>='0'&&s[i]<='9'){
                      e=e*10+(s[i]-'0');
                      i++;
                  }
                  p[num++]=e;
                  e=0;
              }
              else i++;
          }
          num--;
      }

      void dfs(int x,int deep){
          mp[deep]++;
          if(2*x>num){
              return ;
          }
          if(p[2*x]!=-1)dfs(2*x,deep+1);
          if(p[2*x+1]!=-1)dfs(2*x+1,deep+1);
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          getline(cin,s);
          build();
          dfs(1,1);
          int ans=-1;
          for(auto i:mp){
              ans=max(ans,i.second);
          }
          cout<<ans<<endl;
          return 0;
      }

      Q14:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;

      string s;
      int p[N];
      map<int,int> mp;
      int num=1;
      int ans=-1;

      void build(){
          int i=0;
          while(i<s.size()){
              if(s[i]=='#'){
                  p[num++]=-1;
                  i++;
              }
              else if(s[i]>='0'&&s[i]<='9'){
                  int e=0;
                  while(s[i]>='0'&&s[i]<='9'){
                      e=e*10+(s[i]-'0');
                      i++;
                  }
                  p[num++]=e;
                  e=0;
              }
              else i++;
          }
          num--;
      }

      void dfs(int x,int deep){
          if(2*x>num){
              ans=max(ans,deep);
              return ;
          }
          if(p[2*x]!=-1)dfs(2*x,deep+1);
          if(p[2*x+1]!=-1)dfs(2*x+1,deep+1);
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          getline(cin,s);
          build();
          dfs(1,0);
          cout<<ans<<endl;
          
          return 0;
      }

      Q15:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
      using namespace std;

      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef pair<long long, long long> PLL;
      typedef priority_queue<int> PQ;
      const int N = 1005, MAX = 1e9, INF = -1e9;

      int n,m;
      int g[N][N];
      int a,b;

      void floyd(){
          for(int k=1;k<=n;k++){
              for(int i=1;i<=n;i++){
                  for(int j=1;j<=n;j++){
                      g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
                  }
              }
          }
      }

      void solve(){
          memset(g,0x3f,sizeof g);
          for(int i=1;i<=m;i++){
              cin>>a>>b;
              g[a][b]=1;
              g[b][a]=1;
          }
          floyd();
          for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                  if(g[i][j]>=0x3f){
                      cout<<"NO"<<endl;
                      return ;
                  }
              }
          }
          cout<<"YES"<<endl;
          return ;
      }

      signed main()
      {
          fast();

          while(cin>>n>>m){
              if(n==0&&m==0)return 0;
              else solve();
          }
          return 0;
      }

      Q16:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<double,double> PII;
      typedef priority_queue<int> PQ;

      const int N = 1005, MAX = 1e9, INF = -1e9;

      int n,m;
      int a,b;
      int s,t;
      vector<PII> v(N);
      double g[N][N];

      void floyd(){
          for(int k=1;k<=n;k++){
              for(int i=1;i<=n;i++){
                  for(int j=1;j<=n;j++){
                      g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
                  }
              }
          }
      }


      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n;
          for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                  g[i][j]=10000000.0;
              }
          }
          for(int i=1;i<=n;i++){
              cin>>v[i].first>>v[i].second;
          }
          cin>>m;
          for(int i=1;i<=m;i++){
              cin>>a>>b;
              double l=sqrt((v[a].first-v[b].first)*(v[a].first-v[b].first)+(v[a].second-v[b].second)*(v[a].second-v[b].second));
              g[a][b]=l;
              g[b][a]=l;
          }
          floyd();
          cin>>s>>t;
          printf("%.2lf",g[s][t]);

          return 0;
      }

      Q17:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<double,double> PII;
      typedef priority_queue<int> PQ;

      const int N = 1005, MAX = 1e9, INF = 1e9;

      int n,e;
      int g[N][N];
      int a,b,c;
      int dist[N];
      bool st[N];

      int prim(int x) {
          memset(dist, 0x3f, sizeof dist);
          memset(st,false,sizeof st);
          int res = 0;
          dist[x]=0;
          for(int i = 0; i < n; i++) {
              int t = -1;
              for(int j = 1; j <= n; j++) 
                  if(!st[j] && (t == -1 || dist[t] > dist[j]))
                      t = j;       

              res += dist[t];
              
              st[t] = true;
              for(int j = 1; j <= n; j++) dist[j] = min(dist[j], g[t][j]);
          }

          return res;
      }

      void floyd(){
          for(int k=1;k<=n;k++){
              for(int i=1;i<=n;i++){
                  for(int j=1;j<=n;j++){
                      g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
                  }
              }
          }
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          memset(g,0x3f,sizeof g);
          cin>>n>>e;
          for(int i=1;i<=e;i++){
              cin>>a>>b>>c;
              a++;b++;
              g[a][b]=min(g[a][b],c);
          }
          for(int i=1;i<=n;i++){
              g[i][i]=0;
          }
          floyd();
          int ans1=0;int d=MAX;
          for(int i=1;i<=n;i++){
              int d0=-1;bool key=false;
              for(int j=1;j<=n;j++){
                  if(j!=i&&g[j][i]<0x3f){
                      d0=max(d0,g[j][i]);key=true;
                  }
              }
              if(d0<d&&key){
                  ans1=i;d=d0;
              }
          }
          int ans2=MAX;
          for(int i=1;i<=n;i++){
              ans2=min(ans2,prim(i));
          }
          cout<<ans1-1<<" "<<ans2<<endl;

          return 0;
      }

      Q18:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 100, MAX = 1e9, INF = -1e9;
      int const inf=0x3f3f3f;

      int n,v; 
      int f[N][N];

      void floyd(){
              for(int k=1; k<=n; k++)
                  for(int i=1; i<=n; i++) 
                      for(int j=1; j<=n; j++) 
              f[i][j]=min(f[i][j],f[i][k]+f[k][j]);   
      }

      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          scanf("%d%d",&n,&v);
          memset(f,inf,sizeof(f));
          for(int i=1; i<=n; i++) 
              for(int j=1; j<=n; j++) {
              int a;
              if(scanf("%d",&a)) f[i][j]=a;
                  else f[i][j]=inf;
          }
          floyd();
          for(int i=1; i<=n; i++) 
              if(i!=v) 
              printf("(%d -> %d) = %d\n",v,i,f[v][i]);
          return 0;

      }

      Q19:
      #include<bits/stdc++.h>
      #define endl '\n'
      #define int int long long
      #define pb push_back
      #define bs bitset
      using namespace std;
      typedef pair<char,int> PCI;
      typedef pair<int,int> PII;
      typedef priority_queue<int> PQ;

      const int N = 2e5+10, MAX = 1e9, INF = -1e9;
      inline void read(int &x){
          char c=getchar();
          int p=1;
          x=0;
          while(!isdigit(c)){
              if(c=='-')p=-1;
              c=getchar();
          }
          while(isdigit(c)){
              x=(x<<1)+(x<<3)+(c^'0');
              c=getchar();
          }
          x*=p;
      }
      const int maxn=1000;
      int head[maxn],tot,n,deep[maxn],sz[maxn],pre[maxn],ans,dis[maxn];
      struct edge{
          int to,next;
      }e[maxn<<1];
      inline void add(int u,int v){
          e[++tot].to=v;
          e[tot].next=head[u];
          head[u]=tot;
      }
      inline void dfs(int rt,int fa){
          deep[rt]=deep[fa]+1;
          for(register int i=head[rt];i;i=e[i].next){
              if(e[i].to==fa)continue;
              dfs(e[i].to,rt);
              pre[rt]+=pre[e[i].to];
          }
      }
      inline void dp(int rt,int fa){
          for(register int i=head[rt];i;i=e[i].next){
              if(e[i].to==fa)continue;
              dis[e[i].to]=dis[rt]+pre[1]-pre[e[i].to]-pre[e[i].to];
              if(dis[e[i].to]<ans)ans=dis[e[i].to];
              dp(e[i].to,rt);
          }
      }
      signed main(){
          ios::sync_with_stdio(false);
          cin.tie(0);
          read(n);
          for(register int i=1;i<=n;++i){
              int a,b;
              read(sz[i]);read(a);read(b);
              pre[i]=sz[i];
              if(a){
                  add(i,a);
                  add(a,i);
              }
              if(b){
                  add(i,b);
                  add(b,i);
              }
          }
          deep[0]=0;
          dfs(1,0);
          for(register int i=1;i<=n;++i){
              dis[1]+=(deep[i]-1)*sz[i];
          }
          ans=dis[1];
          dp(1,0);
          cout<<ans<<endl;
          return 0;
      }
posted @ 2024-12-21 18:50  Oaths  阅读(53)  评论(0)    收藏  举报