E. DeadLee——(拓扑+贪心)

题意

n种类型食物,每种有wi个,m个人有两种喜欢吃的食物。
每个人吃所有存在喜欢的食物。
构造一个吃食物的顺序,保证每个人至少有一个食物。

解析

倒着考虑,最后的人,至少吃一个,那就吃一个考虑。
如果A食物的需求量<=A食物的数量,吃该食物的人一定可行,同时其他食物的需求量-1,
保证前面的人,有的吃,倒着DAG,拓扑遍历

题目链接

//#pragma GCC optimize(2)
//#pragma GCC target ("sse4")
#include
//typedef long long ll;
#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<
#define eps         1e-6
#define base        131
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define ferma(a,b)  pow(a,b-2)
#define mod(x)      (x%mod+mod)%mod
#define pb          push_back
#define decimal(x)  cout << fixed << setprecision(x);
#define all(x)      x.begin(),x.end()
#define rall(x)      x.rbegin(),x.rend()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
template<typename T> inline T fetch()
{
    T ret;
    cin >> ret;
    return ret;
}
template<typename T> inline vector<T> fetch_vec(int sz)
{
    vector<T> ret(sz);
    for(auto& it: ret)
        cin >> it;
    return ret;
}
template<typename T> inline void makeUnique(vector<T>& v)
{
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
}
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
    //  freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout);
#endif
}
const int N=2e5+5;
int w[N],m[N];
bool vis[N];
set<int> G[N];
signed main()
{
    IOS;
    file();
    int n,cnt;
    cin>>n>>cnt;
    for(int i=1; i<=n; i++)
        cin>>w[i];
    vector<pair<int,int> >vec(cnt);
    for(int i=0; i<cnt; i++)
    {
        cin>>vec[i].F>>vec[i].S;
        G[vec[i].F].insert(i+1);
        G[vec[i].S].insert(i+1);
        m[vec[i].F]++;
        m[vec[i].S]++;
    }
    queue<int>que;
    vector<int>ans;
    for(int i=1; i<=n; i++)
        if(m[i]<=w[i])
            que.push(i),vis[i]=true;
    while(!que.empty())
    {
        int pos=que.front();
        que.pop();
     //   cout<<"pos="<
        vector<int>temp;
        for(auto it:G[pos])
        {
         //   cout<
            ans.pb(it);
            int u=vec[it-1].F,v=vec[it-1].S;
            temp.pb(it);
            m[u]--;
            m[v]--;
              //  cout<if(!vis[u]&&m[u]<=w[u]&&m[u])
                que.push(u),vis[u]=true;
            if(!vis[v]&&m[v]<=w[v]&&m[v])
                que.push(v),vis[v]=true;
        }
        for(auto it:temp)
        {
            G[vec[it-1].F].erase(it);
            G[vec[it-1].S].erase(it);
        }
     //   cout<
    }
    if(ans.size()==cnt)
    {
        cout<<"ALIVE"<<endl;
        reverse(all(ans));
        for(auto it:ans)
            cout<<it<<" ";
    }
    else
        cout<<"DEAD"<<endl;
 
 
 
 
 
    return 0;
}

你可能感兴趣的:(#,拓扑)