标签:
input | output |
---|---|
6 2 3 011000 101000 110000 000011 000101 000110 |
7 0d0000 d00000 000a00 00a0d0 000d00 000000 |
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define inf 0x3f3f3f3f #define mod 10000 typedef long long ll; using namespace std; const int N=105; const int M=50000; int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;} char w[N][N]; int vis[N][N],VIS[N][N]; int n,m,k,c; ll s=0; int parent[N]; int Find(int x) { if(parent[x]!=x)parent[x]=Find(parent[x]); return parent[x]; } void Union(int x,int y) { x=Find(x);y=Find(y); if(x==y)return; parent[y]=x; } int main() { for(int i=0;i<=100;i++)parent[i]=i; int a,d; scanf("%d%d%d",&n,&a,&d); for(int i=1;i<=n;i++){ scanf("%s",w[i]+1); } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(w[i][j]==‘1‘){ int x=Find(i); int y=Find(j); if(x==y)vis[i][j]=vis[j][i]=1,s+=a; else Union(i,j); } } } int ok=Find(1); for(int i=2;i<=n;i++){ int x=Find(i); if(x!=ok&&vis[1][i]!=2)vis[1][i]=vis[i][1]=2,s+=d,Union(1,i); } printf("%lld\n",s); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x=Find(i); int y=Find(j); if(!vis[i][j])printf("0"); else if(vis[i][j]==1)printf("d"); else if(vis[i][j]==2)printf("a"); } printf("\n"); } return 0; }
URAL(timus)1709 Penguin-Avia(并查集)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5855347.html