UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>

J - 小panpan学图论

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

小panpan不会图论,所以图论专题他非常刻苦地学习图论。

今天他认真地学习了萌神的ppt,学习了一下Floyd算法,手持两把锟斤拷的他, 口中疾呼烫烫烫,马上找了到OJ上找了道FLoyd的题:

n个点,m边的无向连通图,无重边,无自环,每条边的长度都是1,求任意两点之间的最短距离

—— 出题人acerlawson

小panpan想了想,写了段代码交了上去,他得到了AC!

出题人acerlawson看了一下小panpan的程序,发现他写了个错误的Floyd, 他选了k个点出来,存在a[]数组里,核心代码如下:

d[i][j] // i,j之间的最短距离
a[i]    // 小panpan事先选好的点

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        if (i == j)
            d[i][j] = 0;
        else
            d[i][j] = INF;
    }
}    

for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &v);
    d[u][v] = 1;
    d[v][u] = 1;
}

for (int r = 1; r <= k; r++) {
    v = a[r];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            d[i][j] = min(d[i][j], d[i][v] + d[v][j]);
}

因为数据太水了,所以小panpan得到了AC。 为了让小panpanWA掉,acerlawson想要出一组数据卡掉小panpan的代码,但是acerlawson忙于陪妹子,所以他找你帮忙。

给出一个n个点m条边的无重边无自环无向连通图,让小panpan的代码得到Wrong Answer

Input

第一行为三个整数n,m,k(3≤n≤400,n−1≤m≤n(n−1)2,2≤k≤n),分别表示图的顶点数,边数和小panpan选的点的数量

第二行k个整数x1,x2,...,xk,(1≤xi≤n),表示小panpan选的点

Output

输出m行,每行两个整数u和v,表示一条无向边(u,v)

如果有多个解,输出任意可行解

如果无论如何小panpan都能AC,则输出No

Sample input and output

Sample Input Sample Output
4 3 2
1 2 
1 3
2 3
2 4
4 3 4
1 2 3 4
No

解题思路:

这是一道构造题.

PPT上那种情况是我们构造的关键.

即我们放一个选择的点在最右边,它的左边一个没有被选的点,再左边整成一个稠密图,容易证明最多支持的边数是:

(n-1)*(n-2) / 2 + x ( x 为没选的点的数量)

图:

这样,我们就按照这种方法构造即可,注意到如果选了所有点,是构造不出来WA的图的,这点要注意

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;

typedef pair <int ,int > Edge;

vector<int>s1; //除掉q1,q2的集合
int q1,q2;
vector<int>s2; //没有选的点集合
vector<Edge>ans;
bool use[450];

//maxedgenumber = (n-1)*(n-2) / 2 + n - k

int main(int argc,char *argv[])
{
  int n,m,k;
  cin >> n >> m >> k;
  if (k == n || 2*m > (n-1)*(n-2) + 2*n - 2 *k)
   cout << "No" << endl;
  else
   {
         memset(use,false,sizeof(use));
         int temp1;
         int ok = 1;
         for(int i = 0 ; i < k ; ++ i)
          {
             int u;
             cin >> u;
             use[u] = true;
             temp1 = u;
       }
      q2 = temp1;
      for(int i = 1 ; i <= n ; ++ i)
       if(!use[i])
        {
            q1 = i;
            break;
        }
      for(int i = 1 ; i <= n ; ++ i)
       if (!use[i] && i != q1)
        s2.push_back(i);
      for(int i = 1 ; i <= n ; ++ i )
        if(i != q1 && i != q2)
         s1.push_back(i);
      int tot = 0;
      for(int i = 0 ; i < s1.size() - 1 ; ++ i)
       {
             ans.push_back(Edge(s1[i],s1[i+1]));
             tot++;
       }
      ans.push_back(Edge(s1[s1.size()-1],q1));
      ans.push_back(Edge(q1,q2));
      tot += 2;
      for(int i = 0 ; i < s1.size() ; ++ i)
       for(int j = i + 2 ; j < s1.size() ; ++ j)
        {
            if (tot < m)
             {
                 ans.push_back(Edge(s1[i],s1[j]));
                 tot++;
             }
        }
      int ptr = 0;
      while(tot < m)
       {
              if (ptr >= s1.size() - 1)
               break;
              ans.push_back(Edge(s1[ptr++],q1));
              tot++;
       }
      ptr = 0;
      while(tot < m)
        {
            if (ptr == s2.size())
             {
                 ok = 0;
                 break;
             }
            if (s2[ptr] == q1)
             {
                 ptr++;
                 continue;
             }
            tot++;
            ans.push_back(Edge(s2[ptr++],q2));
        }
      if (!ok)
        printf("No\n");
      else
       {
             for(int i = 0 ; i < ans.size() ; ++ i)
              printf("%d %d\n",ans[i].first,ans[i].second);
       }
   }
  return 0;
}
时间: 2024-12-26 20:55:39

UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>的相关文章

UESTC_方老师和农场 2015 UESTC Training for Graph Theory&lt;Problem L&gt;

L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师重新开了一家农场,农场一共有N个节点和M条双向边,但是有一个很大的问题就是有比如一个农场A到达农场B只有一条路径,问至少添加多少条边使得任意两个农场之间的路径多于一条. Input 多组数据,EOF结束. 第1行:N和M. 第2到第M+1行:每一行2个数Ui和Vi,表示Ui到

UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory&lt;Problem B&gt;

B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 然而题目和题面并没有什么关系. 给出n个点,m条带权无向边,问你从1号点到n号点的最短路中有多少种走法? Input 第一行两个数n,m分别表示点的个数和边的个数. (2≤n≤2000,1≤m≤2000) 接下来m行,每行3个数u,v,w表示u号点到v号点有一条距离为w的边.(1≤u

UESTC_韩爷的情书 2015 UESTC Training for Graph Theory&lt;Problem H&gt;

H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Submit Status 某年某月某日,韩爷被妹子表白了\o/ 同时,韩爷收到了来自妹子的情书.在好奇心的驱使下,众人想要一览究竟. 显然,羞涩韩爷是不会把情书直接拿出来的. 假设情书长度为n+2,韩爷从中提取出n个长度为3的连续字符串,分给了n个人. 现在这n个人向你求助,能否帮他们把情书恢复出来. I

UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory&lt;Problem D&gt;

D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 邱老师的粉丝众多,每天邱老师都得面对粉丝们数不尽的邀约,邱老师一个人处理不过来,所以想请你帮忙. 假设某天有N个粉丝想和邱老师约,一旦某个粉丝成功地约上了邱老师,她就会发微博和朋友炫耀.一旦某个粉丝发现微博里有关于邱老师的消息,她都会转发. 如果当天内某个约上邱老师的粉丝发现微

UESTC_男神的约会 2015 UESTC Training for Dynamic Programming&lt;Problem J&gt;

J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 有一天男神约了学姐姐去看电影,电影院有一个活动,给你一个10*10的矩阵,每一个格子上都有一个0-9的整数,表示一共十种优惠券中的一种. 观众从左上角的格子开始走,走到右下角.每走到一个有着a号优惠券的格子,都必须要玩一个a分钟的游戏来领取这张优惠券. 每次只能向右或向下走.当走到右

UESTC_排名表 2015 UESTC Training for Graph Theory&lt;Problem I&gt;

I - 排名表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 暑假前集训已经过了一半了,我们将会把当前排名公布出来.但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了. 一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的.现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi.(编号从1开始) 你能帮秋实大哥恢复出排名表吗? Inp

UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory&lt;Problem C&gt;

C - 秋实大哥与时空漫游 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 秋实大哥通过全国的连锁快餐店发家致富,赚了大钱,接下来他打算通过这些钱实现他的另一个梦想————遨游太空,漫游星际. 秋实大哥满怀期待的出发了. .......啦啦啦啦啦啦啦啦啦...... 最后,秋实大哥花完了钱,觉得是时候回地球继续赚钱和过节了. 但是却被告知回地球的专机

UESTC_传输数据 2015 UESTC Training for Graph Theory&lt;Problem F&gt;

F - 传输数据 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,现在需要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行

UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory&lt;Problem A&gt;

A - 秋实大哥与连锁快餐店 Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 成大事者,不惟有超世之才,亦有坚忍不拔之志. 秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金.为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱.假设现在有n家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为(xi,