跟书上一样,建立一个表格和访问标识,然后就遍历啦,不过路径变化比较巧妙。
Code
#include<iostream>
using namespace std;
char map[101][101];
int m,n,i,j;
bool visited[101][101];
int d[8][2]={{1,0},{1,1},{1,-1},{0,-1},{0,1},{-1,0},{-1,1},{-1,-1}};
bool In(int x,int y)
{
return x>0&&y>0&&y<=n&&x<=m;
}
void Search(int x,int y)
{
visited[x][y]=true;
for(int i=0;i<8;i++)
if( In(x+d[i][0],y+d[i][1])&&map[x+d[i][0]][y+d[i][1]]=='@'&&!visited[x + d[i][0]][y + d[i][1]])
Search(x + d[i][0], y + d[i][1]);
}
int solves()
{
int count=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(map[i][j]=='@'&&!visited[i][j])
{Search(i,j);
++count; }
return count;
}
int main()
{
while(cin>>m>>n&&(m||n))
{
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin>>map[i][j];
visited[i][j]=false;
}
cout<<solves()<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
char map[101][101];
int m,n,i,j;
bool visited[101][101];
int d[8][2]={{1,0},{1,1},{1,-1},{0,-1},{0,1},{-1,0},{-1,1},{-1,-1}};
bool In(int x,int y)
{
return x>0&&y>0&&y<=n&&x<=m;
}
void Search(int x,int y)
{
visited[x][y]=true;
for(int i=0;i<8;i++)
if( In(x+d[i][0],y+d[i][1])&&map[x+d[i][0]][y+d[i][1]]=='@'&&!visited[x + d[i][0]][y + d[i][1]])
Search(x + d[i][0], y + d[i][1]);
}
int solves()
{
int count=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(map[i][j]=='@'&&!visited[i][j])
{Search(i,j);
++count; }
return count;
}
int main()
{
while(cin>>m>>n&&(m||n))
{
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin>>map[i][j];
visited[i][j]=false;
}
cout<<solves()<<endl;
}
return 0;
}
TOJ 1075. Stockbroker Grapevine
先输入路径,接着求最短路径,最后求出中路径最短的点输出,并输出由改点出发的最长路径。
Code
#include <iostream>
#define INFTY 1000000000
using namespace std;
int main(void)
{
int n,i,m,j,k,l,d[100][100];
while(cin>>n&&n!=0)
{//输入路径
if (n==1) {printf("1 0\n");continue;}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
d[i][j]=INFTY;
for(i=0;i<n;i++)
{
cin>>m;
if(m!=0)
{
for(j=0;j<m;j++)
{
cin>>k;cin>>l;
d[i][k-1]=l;
}
}
}
for(i=0;i<n;i++) d[i][i]=0;
/* for(i=0;i<n;i++)
{for(j=0;j<n;j++)
cout<<d[i][j]<<" ";
cout<<endl;}*/
//floyd
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(d[i][k]+d[k][j]<d[i][j]){
d[i][j]=d[i][k]+d[k][j];
}
/* for(i=0;i<n;i++)
{for(j=0;j<n;j++)
cout<<d[i][j]<<" ";
cout<<endl;}*/
//从某点出发的总路径最短,最长路经
int sum[100];
for(i=0;i<n;i++)
sum[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(sum[i]+d[i][j]<INFTY) sum[i]+=d[i][j];
else sum[i]=INFTY;
/*for(i=0;i<n;i++) cout<<sum[i]<<endl;*/
int t=INFTY;
for(i=0;i<n;i++)
if(sum[i]<t) {t=sum[i];k=i;}//k记录总路经最短的点
int temp=d[k][0];
for(i=1;i<n;i++)
if(d[k][i]>temp) temp=d[k][i];
if(t==INFTY) cout<<"disjoint\n";
else cout<<k+1<<" "<<temp<<endl;
}
return 0;
}
#include <iostream>
#define INFTY 1000000000
using namespace std;
int main(void)
{
int n,i,m,j,k,l,d[100][100];
while(cin>>n&&n!=0)
{//输入路径
if (n==1) {printf("1 0\n");continue;}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
d[i][j]=INFTY;
for(i=0;i<n;i++)
{
cin>>m;
if(m!=0)
{
for(j=0;j<m;j++)
{
cin>>k;cin>>l;
d[i][k-1]=l;
}
}
}
for(i=0;i<n;i++) d[i][i]=0;
/* for(i=0;i<n;i++)
{for(j=0;j<n;j++)
cout<<d[i][j]<<" ";
cout<<endl;}*/
//floyd
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(d[i][k]+d[k][j]<d[i][j]){
d[i][j]=d[i][k]+d[k][j];
}
/* for(i=0;i<n;i++)
{for(j=0;j<n;j++)
cout<<d[i][j]<<" ";
cout<<endl;}*/
//从某点出发的总路径最短,最长路经
int sum[100];
for(i=0;i<n;i++)
sum[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(sum[i]+d[i][j]<INFTY) sum[i]+=d[i][j];
else sum[i]=INFTY;
/*for(i=0;i<n;i++) cout<<sum[i]<<endl;*/
int t=INFTY;
for(i=0;i<n;i++)
if(sum[i]<t) {t=sum[i];k=i;}//k记录总路经最短的点
int temp=d[k][0];
for(i=1;i<n;i++)
if(d[k][i]>temp) temp=d[k][i];
if(t==INFTY) cout<<"disjoint\n";
else cout<<k+1<<" "<<temp<<endl;
}
return 0;
}
简洁的DFS
Code
#include<iostream>
using namespace std;
int n,m,g[101][101],v[101];
void dfs(int i)
{
int j;
v[i]=1;
for(j=0;j<n;j++)
{
if(g[i][j]==1)
if(!v[j])
dfs(j);
}
}
int main()
{
int test,a,b,i,j,k;
cin>>test;
while(test-->0)
{
k=0;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
g[i][j]=0;
while(m-->0)
{
cin>>a>>b;
g[a-1][b-1]=1;
g[b-1][a-1]=1;
}
for(i=0;i<n;i++)
v[i]=0;
for(i=0;i<n;i++)
if(!v[i])
{
dfs(i);
k++;
}
cout<<k<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int n,m,g[101][101],v[101];
void dfs(int i)
{
int j;
v[i]=1;
for(j=0;j<n;j++)
{
if(g[i][j]==1)
if(!v[j])
dfs(j);
}
}
int main()
{
int test,a,b,i,j,k;
cin>>test;
while(test-->0)
{
k=0;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
g[i][j]=0;
while(m-->0)
{
cin>>a>>b;
g[a-1][b-1]=1;
g[b-1][a-1]=1;
}
for(i=0;i<n;i++)
v[i]=0;
for(i=0;i<n;i++)
if(!v[i])
{
dfs(i);
k++;
}
cout<<k<<endl;
}
return 0;
}