codeforces 1369E DeadLee
题意
李的店里有\(n\)种美食,第\(i\)种美食有\(a_i\)个,李有\(m\)个朋友,第\(i\)个朋友喜欢第\(x_i\)和第\(y_i\)个两种不同的美食,每个朋友来到店会吃两种他喜欢的美食各一个,如果其中一种美食不够了就只吃另一种美食,李想让你帮他安排朋友到店的先后顺序,使他的每个朋友都至少吃到一种美食。
分析
令\(s_i\)为每个朋友两种食物都吃到的情况下第\(i\)种食物需要的个数。
若存在\(s[i]<=a[i]\),则无论如何喜欢这个食物的人都能得到满足,我们可以将喜欢这个食物的人往后放,并将他们喜欢的另一种食物\(x\)的需要个数\(s[x]\)减一,继续上述过程,直到所有人的到店顺序都排好,如果对于任意\(s[i]\)都有\(s[i]>a[i]\),则无解。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<sstream>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define per(i,n,x) for(int i=n;i>=x;i--)
#define sz(a) int(a.size())
#define rson mid+1,r,p<<1|1
#define pii pair<int,int>
#define lson l,mid,p<<1
#define ll long long
#define pb push_back
#define mp make_pair
#define se second
#define fi first
using namespace std;
const double eps=1e-8;
const int mod=1e9+7;
const int N=2e5+10;
const int inf=1e9;
int n,m;
int a[N],s[N],vis[N];
vector<pii>g[N];
int main(){
ios::sync_with_stdio(false);
//freopen("in","r",stdin);
cin>>n>>m;
rep(i,1,n){
cin>>a[i];
}
rep(i,1,m){
int x,y;
cin>>x>>y;
g[x].pb(mp(y,i));
g[y].pb(mp(x,i));
s[x]++;
s[y]++;
}
queue<int>q;
rep(i,1,n) if(s[i]<=a[i]){
q.push(i);
}
vector<int>ans;
while(!q.empty()){
int u=q.front();q.pop();
if(vis[u]) continue;
vis[u]=1;
for(pii x:g[u]){
if(vis[x.fi]) continue;
ans.pb(x.se);
if(--s[x.fi]<=a[x.fi]){
q.push(x.fi);
}
}
}
reverse(ans.begin(), ans.end());
if(sz(ans)==m){
puts("ALIVE");
for(int x:ans) printf("%d ",x);
}else{
puts("DEAD");
}
return 0;
}