水题
题意:有n个城市,给你每个城市能到达城市的数量,要你构图,输出有向边,要求无环,输出任意的解
例:
Sample Input
3
3
2 1 0
2
1 1
4
3 1 1 0
Sample Output
Case #1: Yes
2
1 2
2 3
Case #2: No
Case #3: Yes
4
1 2
1 3
2 4
3 4
想法:不构成环,就是最终有一个边为零,所以至少有一城市能到达的城市数为零,所以可以逐层的连向零点的边,如果最后为都为零,表示构图成功,否则失败
代码:
#include <iostream> #include <stack> #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #define maxn 110000 using namespace std;struct node {int v,i;} a[1100]; bool cmp(node a,node b) {return a.v<b.v; } int b[1000000+88][2];int main() {int t;cin>>t;int dd=0;while(t--){int n;cin>>n;for(int i=1; i<=n; i++){cin>>a[i].v;a[i].i=i;}sort(a+1,a+n+1,cmp);int ans=0;bool faa=true;for(int i=1; i<=n; i++){if(a[i].v!=0){printf("Case #%d: No\n",++dd);faa=false;break;}bool fa=true;for(int q=i; q<=n; q++){if(a[q].v!=0)fa=false;}if(fa){printf("Case #%d: Yes\n",++dd);break;}for(int q=i; q<=n; q++){if(a[q].v!=0){b[ans][0]=a[q].i;b[ans++][1]=a[i].i;a[q].v--;}}}if(faa){printf("%d\n",ans);for(int i=0; i<ans; i++){printf("%d %d\n",b[i][0],b[i][1]);}}}return 0; }