sgu272:Evacuation plan(大水题)

来源:互联网 发布:域名转入自己的服务器 编辑:程序博客网 时间:2024/05/01 07:22

题目大意:
      给你n个点m条无向边,有些点属于集合A,有些点属于集合B,且AB=ϕ。给出一种路径安排方案,使得每条路径起点为xA,终点为yB,且两两之间不经过同样的点,且长度=min{disx,y},且不能再找到一条新的路径满足上述条件。

分析:
      这题目限制太弱了啊,“不能再找到一条新的路径满足上述条件”意味着我们可以一直dfs,直到dfs不动了即可。

AC code:

#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <cctype>#include <algorithm>#include <string>#include <sstream>#include <iostream>#include <map>#include <set>#include <list>#include <stack>#include <queue>#include <vector>#define pb push_back#define mp make_pairtypedef long long LL;typedef double DB;typedef long double LD;using namespace std;const int MAXN = 10009;const int MAXM = 220009;const int INF = 0x3f3f3f3f;int n, m;int n1, n2;int s, t;struct Ugraph{    int size;    int head[MAXN];    int d[MAXM];    int to[MAXM];    int ne[MAXM];    Ugraph() {size = 1;}    void add_edge(int u, int v)    {        to[size] = v, ne[size] = head[u], head[u] = size++;        to[size] = u, ne[size] = head[v], head[v] = size++;    }}G;int dis[MAXN];bool vis[MAXN];vector< vector<int> > ans; void spfa(int s){    queue<int> q;    memset(dis, INF, sizeof dis);    memset(vis, false, sizeof vis);    q.push(s), dis[s] = 0, vis[s] = true;    while(!q.empty())    {        int now = q.front(), to;        q.pop(), vis[now] = false;        for(int i = G.head[now]; i; i = G.ne[i])        {            to = G.to[i];            if(dis[to] > dis[now]+1)            {                dis[to] = dis[now]+1;                if(!vis[to])                {                    vis[to] = true;                    q.push(to);                }            }        }    }}vector<int> cur;bool dfs(int x){    if(x == t)    {        ans.pb(cur);        return true;    }    if(x != s && x != t)    {        cur.pb(x);        vis[x] = true;    }    for(int i = G.head[x]; i; i = G.ne[i])    {        int y = G.to[i];        if(dis[x]+1 == dis[y] && !vis[y])        {            if(dfs(y) && x != s)             {                cur.pop_back();                return true;            }        }    }    cur.pop_back();    return false;}int main(){    #ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);    #endif    scanf("%d%d", &n, &m);    s = n+1, t = s+1;    for(int i = 1; i <= m; ++i)    {        int u, v;        scanf("%d%d", &u, &v);        G.add_edge(u, v);    }    scanf("%d", &n1);    for(int i = 1; i <= n1; ++i)    {        int x;        scanf("%d", &x);        G.add_edge(s, x);    }    scanf("%d", &n2);    for(int i = 1; i <= n2; ++i)    {        int x;        scanf("%d", &x);        G.add_edge(x, t);    }    spfa(s);    memset(vis, false, sizeof vis);    dfs(s);    printf("%d %d\n", ans.size(), dis[t]-2);    for(int i = 0, sz = ans.size(); i < sz; ++i)    {        printf("%d", ans[i][0]);        for(int j = 1; j < dis[t]-1; ++j)            printf(" %d", ans[i][j]);        puts("");    }    #ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);    #endif    return 0;}
0 0
原创粉丝点击