hdu 5813 Elegant Construction
水题
题意:有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; }

浙公网安备 33010602011771号