图论真难……
【洛谷B3647】floyd
#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
int w[200][200]={0},d[200][200]={0},vis[200];
int main(){
int n,m,a,b,minn,s,nex,dis;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
w[i][j]=inf;
if(i!=j)
d[i][j]=inf;
}
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&dis);
//cin>>a>>b>>w[a][b];
w[a][b]=min(w[a][b],dis);
w[b][a]=w[a][b];
//cout<<w[b][a]<<' '<<w[a][b]<<endl;
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
s=i;
while(1){
minn=inf;
for(int j=1;j<=n;j++){
if(w[s][j]!=inf)
d[i][j]=min(d[i][j],d[i][s]+w[s][j]);
if(minn>d[i][j]&&vis[j]==0){
nex=j;
minn=d[i][j];
}
}
if(minn==inf)break;
s=nex;
vis[nex]=1;
}
for(int j=1;j<=n;j++){
if(i<=j)
cout<<d[i][j]<<' ';
else
cout<<d[j][i]<<' ';
}
cout<<endl;
}
return 0;
}
【洛谷P4799】单源最短路径
是链表,玩不会了
【洛谷P2661】信息传递
#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
int len[200010],fu[200010],m,minn=inf;
int check(int a){
m++;
if(fu[a]==a)
return a;
else
return check(fu[a]);
}
int main (){
int n,t;
cin>>n;
for(int i=1;i<=n;i++){
fu[i]=i;
}
for(int i=1;i<=n;i++){
m=0;
cin>>t;
int f=check(t);//t是i传递的下一位
if(i==f)
minn=min(minn,m);
else
fu[i]=t;
}
cout<<minn;
return 0;
}
【洛谷P1144】最短路计数
和单源最短路径差不多,所以也不会
【洛谷P8794】环境治理
#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffff
#define inff 2e31-2
#define ll long long
int le[110][110],w[110][110],ww[110][110];
int main (){
int n,s,ans=-1;
ll p,q;
cin>>n>>q;
ll l=0,r=n*100000,mid;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>w[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>le[i][j];
while(l<=r){
mid=(r+l)/2;
p=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
ww[i][j]=w[i][j]-mid/n*2;
if(mid%n>i)ww[i][j]--;
if(mid%n>j)ww[i][j]--;
if(ww[i][j]<le[i][j])ww[i][j]=le[i][j];
ww[j][i]=ww[i][j];
}//初始化
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++){
ww[i][j]=min(ww[i][j],ww[i][k]+ww[k][j]);
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
p+=ww[i][j];
}
}
if(p>=q){
l=mid+1;
}else{
r=mid-1;
ans=mid;
}
}
cout<<ans;
return 0;
}
【洛谷P3367】查并集
#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffff
#define ll long long
int fu[10100];
int find(int x){
if(x==fu[x])return x;
return fu[x]=find(fu[x]);
}
int main (){
int n,m,x,y,z;
cin>>n>>m;
for(int i=1;i<=n;i++)
fu[i]=i;
for(int i=0;i<m;i++){
cin>>z>>x>>y;
if(z==1){//合并
fu[find(x)]=find(y);
//x集合的祖辈和y集合一样就行
}else{//查找
if(find(x)==find(y))
cout<<"Y\n";
else
cout<<"N\n";
}
}
return 0;
}