TJU-3847 SanXII(图论)

来源:互联网 发布:桥畔译谈CIP数据 编辑:程序博客网 时间:2024/05/22 17:31

自己的想法:

如果一条边的两点属于一个国家,那么建边,否则不予理会。

建图完毕后跑一遍floyd(其实有判断连通性的和FLOYD类似的算法,忘记怎么写了,就用floyd代替了)

然后遍历每个国家检验是否每个城市都联通。

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;const int MAXC=65536;const int MAXN=40;const int INF=1E6;int City        [MAXN+5];//每个城市属于哪个国家int CityNum     [MAXC+5];//每个国家城市的数量int Num [MAXC+5][MAXN+5];//每个国家有那些城市intdist[MAXN+5][MAXN+5];//城市与城市之间的距离int min(int x,int y){return x<y?x:y;}void work(int n,int m){int i,j,k,t,ans;int x,y,flag;memset(City,0,sizeof(City));memset(CityNum,0,sizeof(CityNum));for(i=0;i<=MAXN;i++)for(j=0;j<=MAXN;j++)dist[i][j]=INF;for(i=1;i<=n;i++){scanf("%d",&t);City[i]=t;CityNum[t]++;Num[t][CityNum[t]]=i;}while(m--){scanf("%d%d",&x,&y);dist[x][x]=0;dist[y][y]=0;if(City[x]==City[y]){dist[x][y]=1;dist[y][x]=1;}}for(k=1;k<=n;k++)    for(i=1;i<=n;i++)      for(j=1;j<=n;j++)       {        t=dist[i][k]+dist[k][j];        if(t<dist[i][j]) dist[i][j]=t;        }     ans=0;for(i=1;i<=MAXC;i++){if(CityNum[i]==0) continue;flag=0;for(j=1;j<CityNum[i];j++)for(k=j+1;k<=CityNum[i];k++)if(dist[Num[i][j]][Num[i][k]]>=INF){flag=1;break;}if(flag) ans++;}printf("%d\n",ans);}int main(){int n,m;while(~scanf("%d%d",&n,&m)) work(n,m);return 0;}


0 0
原创粉丝点击