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;
}
posted @ 2020-06-30 23:44  xyq0220  阅读(177)  评论(0编辑  收藏  举报