uva 10763 Foreign Exchange

给定n对信息,是1-->2有一对交换生,能交换的条件是2-->1也有一对交换生,问能否顺利交换。

思路:用有向图模拟,如果1-->2有一对,那么就优先判断2-->1有没人交换,有的话,就不用加边了,直接标记那条边用了即可。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 5e5+20;
int n,now;
struct edge
{
    int u,v,w;
    int id;//区分无向图的时候用的,id相同就是同一条边
    int next;
} e[maxn*2]; //这个存的是边,要插入两次,所以要*2
int first[maxn]; //这个表示什么【顶点】的第一条边,所以只用maxn大小即可
int num=0;//从1开始,这样就是没0号这条边。方便判断。所以每次先++num再放边!!
void add (int u,int v,int w)
{
    ++num; //这个num是边的编号
    e[num].u=u;  e[num].v=v;  e[num].w=w;
    e[num].id=0;
    e[num].next=first[u];//下一条边是这个顶点的第一条边
    first[u]=num;//这个顶点的第一条边是编号为num的这条
    return ;
}

void work ()
{
    num = 0;
    now = 0;
    memset(first,0,sizeof first);
    for (int i=1;i<=n;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        bool flag = 1;
        for (int j = first[v]; j ; j = e[j].next)
        {
            if (e[j].v == u && e[j].id == 0)
            {
                flag = 0;
                e[j].id=1;
                now--;
                break;
            }
        }
        if (flag)
        {
            now++;
            add(u,v,1);
        }
    }
    if (now==0)
    {
        printf ("YES\n");
    }
    else printf ("NO\n");
}
int main()
{
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    while (scanf("%d",&n)!=EOF && n) work();
    return 0;
}

时间: 2024-10-21 21:47:11

uva 10763 Foreign Exchange的相关文章

紫书第五章训练 uva 10763 Foreign Exchange by crq

Your non-profit organization (iCORE - international Confederation of Revolver Enthusiasts) coordinates a very successful foreign student exchange program. Over the last few years, demand has sky-rocketed and now you need assistance with your task.The

uva 10763 Foreign Exchange(排序+二分查找)

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就 想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心 了...看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多 三颗... 思路: 我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了 lower_bound,upper_bound,注释里

uva:10763 - Foreign Exchange(排序)

题目:10763 - Foreign Exchange 题目大意:给出每个同学想要的交换坐标 a, b 代表这位同学在位置a希望能和b位置的同学交换.要求每一位同学都能找到和他交换的交换生. 解题思路:把给定的原先给定的序列,交换前后位置后得到新的序列.如果这个新的序列和原来的序列相同就符合要求.因为  (a,b) (b, a)若是成对出现,那么前后交换后还是(b, a)(a,b). 代码: #include <stdio.h> #include <string.h> #inclu

Foreign Exchange

 10763 Foreign ExchangeYour non-profit organization (iCORE - international Confederation of Revolver Enthusiasts) coordinatesa very successful foreign student exchange program. Over the last few years, demand hassky-rocketed and now you need assistan

UVA Foreign Exchange

Foreign Exchange Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Your non-profit organization (iCORE - international Confederation of Revolver Enthusiasts) coordinates a very successful foreign student exchange program. Over th

Foreign Exchange(交换生换位置)

 Foreign Exchange Your non-profit organization (iCORE - international Confederation of Revolver Enthusiasts) coordinates a very successful foreign student exchange program. Over the last few years, demand has sky-rocketed and now you need assistance

UVa 10763 (STL) Foreign Exchange

看到大神说location的值不会超过1000,所以这就简单很多了,用一个deg数组记录下来每个点的度,出度-1,入读+1这样. 最后判断每个点的度是否为0即可. 至于为什么会这样,据说是套数据套出来的,比如在代码里加一句if(a >= 1000) for(;;),get新技能! 如果按正常来做的话,我能想到的就是遍历map了. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 1000; 5 int

UVA10763:Foreign Exchange&amp;&amp;UVA10340: All in All(水题)

10763:水题不解释直接贴代码. #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <queue> #define eps 1e-9 typedef long long ll; using namespace std; int n; int d[500100]; int

uva 10763 多种方法

题意:给出n个二元组,让你判断是否每一个二元组都存在一个与之对应的对称的二元组,且每个二元组不能和多个其他二元组相对应. 方法1: 利用map来为每个二元组计数,判断是否有map[a][b] == map[b][a]. 1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 using namespace std; 5 6 typedef pair<int, int> pii; 7 map&l