KuanTall

Untitled

Jan 15th, 2023 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 8.17 KB | Fixit | 0 0
  1. 第一題
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4.  
  5. void killSubdivision(vector<vector<bool>> &graph){
  6.     for(int i = 0 ; i < graph.size() ; i++){
  7.         int num = 0;
  8.         int a = -1, b = -1;
  9.         for(int j = 0 ; j < graph.size() ; j++){
  10.             if(graph[i][j] == true){
  11.                 if(a == -1){
  12.                     a = j;
  13.                 }
  14.                 else if(a != -1 && b == -1){
  15.                     b = j;
  16.                 }
  17.                 num++;
  18.             }
  19.             if(num > 2)
  20.                 break;
  21.         }
  22.         if(num == 2){
  23.             for(int j = 0 ; j < graph.size() ; j++){
  24.                 if(i != j){
  25.                     graph[i][j] = false;
  26.                     graph[j][i] = false;
  27.                 }
  28.             }
  29.             graph[a][b] = true;
  30.             graph[b][a] = true;
  31.         }
  32.     }
  33. }
  34.  
  35. bool findK5(vector<vector<bool>> &graph){
  36.     for(int a = 0 ; a < graph.size() ; a++){
  37.         for(int b = 0; b < graph.size() ; b++){
  38.             for(int c = 0 ; c < graph.size() ; c++){
  39.                 for(int d = 0; d < graph.size() ; d++){
  40.                     for(int e = 0; e < graph.size() ; e++){
  41.                         if(a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e)
  42.                         if(graph[a][b] && graph[a][c] && graph[a][d] && graph[a][e] && graph[b][c] && graph[b][d] && graph[b][e] && graph[c][d] && graph[c][e] && graph[d][e]){
  43.                             return true;
  44.                         }
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.     }
  50.     return false;
  51. }
  52.  
  53. bool findK33(vector<vector<bool>> &graph){
  54.     for(int a = 0 ; a < graph.size() ; a++){
  55.         for(int b = 0 ; b < graph.size() ; b++){
  56.             for(int c = 0 ; c < graph.size() ; c++){
  57.                 for(int d = 0 ; d < graph.size() ; d++){
  58.                     for(int e = 0 ; e < graph.size() ; e++){
  59.                         for(int f = 0 ; f < graph.size() ; f++){
  60.                             if(a != b && a != c && a != d && a != e && a != f && b != c && b != d && b != e && b != f && c != d && c != e && c != f && d != e && d != f && e != f)
  61.                                 if(graph[a][d] && graph[a][e] && graph[a][f] && graph[b][d] && graph[b][e] && graph[b][f] && graph[c][d] && graph[c][e] && graph[c][f]){
  62.                                     return true;
  63.                                 }
  64.                         }
  65.                     }
  66.                 }
  67.             }
  68.         }
  69.     }
  70.     return false;
  71. }
  72.  
  73. int main(){
  74.     int Q;
  75.     cin>>Q;
  76.     for(int i = 0 ; i < Q ; i++){
  77.         int n, m;
  78.         cin>>n>>m;
  79.         vector<vector<bool>> graph(n, vector<bool>(n, false));
  80.         int u, v;
  81.         for(int j = 0 ; j < m ; j++){
  82.             cin>>u>>v;
  83.             graph[u-1][v-1] = true;
  84.             graph[v-1][u-1] = true;
  85.         }
  86.         killSubdivision(graph);
  87.         if(findK5(graph)){
  88.             cout<<"No\n";
  89.             continue;
  90.         }
  91.         if(findK33(graph)){
  92.             cout<<"No\n";
  93.             continue;
  94.         }
  95.         cout<<"Yes\n";
  96.     }
  97.  
  98.     return 0;
  99. }
  100.  
  101.  
  102. 第二題
  103. #include<bits/stdc++.h>
  104. using namespace std;
  105.  
  106. struct Edge
  107. {
  108.     int src, dest;
  109. };
  110.  
  111. struct Graph
  112. {
  113.     int V, E;
  114.     Edge* edge;
  115. };
  116.  
  117. struct subset
  118. {
  119.     int parent;
  120.     int rank;
  121. };
  122. int find(struct subset subsets[], int i);
  123. void Union(struct subset subsets[], int x, int y);
  124.  
  125. int kargerMinCut(struct Graph* GRAPH)
  126. {
  127.     struct Graph* graph = GRAPH;
  128.     int V = graph->V, E = graph->E;
  129.     Edge *edge = graph->edge;
  130.  
  131.     struct subset *subsets = new subset[V];
  132.  
  133.     for (int v = 0; v < V; ++v)
  134.     {
  135.         subsets[v].parent = v;
  136.         subsets[v].rank = 0;
  137.     }
  138.  
  139.     int vertices = V;
  140.  
  141.     while (vertices > 2)
  142.     {
  143.     int i = rand() % E;
  144.  
  145.     int subset1 = find(subsets, edge[i].src);
  146.     int subset2 = find(subsets, edge[i].dest);
  147.  
  148.     if (subset1 == subset2)
  149.         continue;
  150.     else
  151.     {
  152.         vertices--;
  153.         Union(subsets, subset1, subset2);
  154.     }
  155.     }
  156.  
  157.     int cutedges = 0;
  158.     for (int i=0; i<E; i++)
  159.     {
  160.         int subset1 = find(subsets, edge[i].src);
  161.         int subset2 = find(subsets, edge[i].dest);
  162.         if (subset1 != subset2)
  163.         cutedges++;
  164.     }
  165.  
  166.     return cutedges;
  167. }
  168.  
  169. int find(struct subset subsets[], int i)
  170. {
  171.     if (subsets[i].parent != i)
  172.     subsets[i].parent =
  173.             find(subsets, subsets[i].parent);
  174.  
  175.     return subsets[i].parent;
  176. }
  177.  
  178. void Union(struct subset subsets[], int x, int y)
  179. {
  180.     int xroot = find(subsets, x);
  181.     int yroot = find(subsets, y);
  182.  
  183.     if (subsets[xroot].rank < subsets[yroot].rank)
  184.         subsets[xroot].parent = yroot;
  185.     else if (subsets[xroot].rank > subsets[yroot].rank)
  186.         subsets[yroot].parent = xroot;
  187.  
  188.     else
  189.     {
  190.         subsets[yroot].parent = xroot;
  191.         subsets[xroot].rank++;
  192.     }
  193. }
  194.  
  195. struct Graph* createGraph(int V, int E)
  196. {
  197.     Graph* graph = new Graph;
  198.     graph->V = V;
  199.     graph->E = E;
  200.     graph->edge = new Edge[E];
  201.     return graph;
  202. }
  203.  
  204. int main()
  205. {
  206.     int V, E;
  207.     cin>>V>>E;
  208.     struct Graph* graph = createGraph(V, E);
  209.     int u, v;
  210.     for(int i = 0 ; i < E ; i++){
  211.         cin>>u>>v;
  212.         graph->edge[i].src = u-1;
  213.         graph->edge[i].dest = v-1;
  214.     }
  215.     vector<int> cunt(100, 0);
  216.     srand(time(NULL));
  217.     for(int i = 0 ; i < 100 ; i++){
  218.         cunt[kargerMinCut(graph)]++;
  219.     }
  220.     for(int i = 0 ; i < 100 ; i++){
  221.         if(cunt[i] > 0){
  222.             cout<<i;
  223.             return 0;
  224.         }
  225.     }
  226.  
  227.     return 0;
  228. }
  229.  
  230. 第三題
  231. #include <bits/stdc++.h>
  232. using namespace std;
  233. struct Edge{
  234.     int index;
  235.     int from;
  236.     int to;
  237.     int weight;
  238.     Edge(int a, int u, int v, int w):index(a), from(u), to(v), weight(w){};
  239. };
  240.  
  241. int main(){
  242.     int n, m;
  243.     int u, v, w;
  244.     cin>>n>>m;
  245.     vector<vector<Edge>> adj(n);
  246.     vector<Edge> pp;
  247.     for(int i = 1 ; i <= m ; i++){
  248.         cin>>u>>v>>w;
  249.         adj[u-1].push_back(Edge(i, u-1, v-1 ,w));
  250.         pp.push_back(Edge(i, u-1, v-1, w));
  251.     }
  252.     vector<bool> visited(n, false);
  253.     vector<pair<unsigned int, int>> cost(n, pair<unsigned int, int>(3000000000, -1));
  254.     cost[0] = {0, -1};
  255.     int now = 0;
  256.     while(visited[1] != true){
  257.         int min = INT_MAX;
  258.         for(int i = 1 ; i < cost.size() ; i++){
  259.             if(visited[i] == false && cost[i].first < min){
  260.                 now = i;
  261.             }
  262.         }
  263.         visited[now] = true;
  264.         for(int i = 0 ; i < adj[now].size() ; i++){
  265.             if(cost[adj[now][i].to].first > cost[now].first + adj[now][i].weight){
  266.                 cost[adj[now][i].to].first = cost[now].first + adj[now][i].weight;
  267.                 cost[adj[now][i].to].second = now;
  268.             }
  269.         }
  270.     }
  271.     int sp = cost[1].first;
  272.     for(int i = 0 ; i < pp.size() ; i++){
  273.         //cout<<endl<<i<<endl<<endl;
  274.         vector<bool> Visited(n, false);
  275.         vector<pair<unsigned int, int>> Cost(n, pair<unsigned int, int>(3000000000, -1));
  276.         Cost[0] = {0, -1};
  277.         now = 0;
  278.         int U = pp[i].from;
  279.         int V = pp[i].to;
  280.         int W = pp[i].weight;
  281.         for(int j = 0 ; j < n ; j++){
  282.             int min = INT_MAX;
  283.             //for(int i = 0 ; i < Cost.size() ; i++)cout<<Cost[i].first<<" ";
  284.             for(int i = 1 ; i < Cost.size() ; i++){
  285.                 if(Visited[i] == false && Cost[i].first < min){
  286.                     now = i;
  287.                 }
  288.             }
  289.             Visited[now] = true;
  290.             //cout<<endl<<now;
  291.             //cout<<endl<<U;
  292.             for(int i = 0 ; i < adj[now].size() ; i++){
  293.                 if(now != U || adj[now][i].to != V)
  294.                 if(Cost[adj[now][i].to].first > Cost[now].first + adj[now][i].weight){
  295.                     Cost[adj[now][i].to].first = Cost[now].first + adj[now][i].weight;
  296.                     Cost[adj[now][i].to].second = now;
  297.                 }
  298.             }
  299.             if(now == V){
  300.                 if(Cost[U].first > Cost[V].first + W){
  301.                     Cost[U].first = Cost[V].first + W;
  302.                     Cost[U].second = V;
  303.                 }
  304.             }
  305.  
  306.         }
  307.         //cout<<sp<<endl;
  308.         //cout<<Cost[1].first<<endl;
  309.         if(Cost[1].first < sp)
  310.             cout<<"HAPPY\n";
  311.         else if(Cost[1].first == sp)
  312.             cout<<"SOSO\n";
  313.         else
  314.             cout<<"SAD\n";
  315.     }
  316.  
  317.     return 0;
  318. }
Tags: 含陶教召
Add Comment
Please, Sign In to add comment