floyd的总结

27 篇文章 0 订阅
3 篇文章 0 订阅

基础:

   HDU1596

   HDU2112 

   HDU1874 

   HDU1869 

   HDU2066 

   HDU2094

   HDU2544 

   


稍加复杂

HDU1217    顺练习map离散    难度1.5

HDU1245    处理起点,终点    难度2.5

HDU1535    2次迪杰斯特拉      难度2

HDU2170                                  难度x

HDU3631                                  难度x

HDU4284   BFS+floyd              难度2.5

加深对k的理解:

   HDU1599(最小环)  ZOJ3710

判环:

  HDU1317  


暴力搜索+floyd

HDU1217
#include<cstdlib>
#include<iostream>
#include<map>
using namespace std;
int n,m,Case=0;
map<string,int>q;
double Map[100][100],tmp;
string s,s1,s2;
int main()
{
    int i,j,k;
    bool flag;
    while(~scanf("%d",&n)){
        if(n<=0) return 0;
        q.clear();
        for(i=1;i<=n;i++){
            cin>>s;
            q[s]=i;
        }
        cin>>m;
        for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          if(i==j) Map[i][j]=1;
          else Map[i][j]=0;
        for(i=1;i<=m;i++){
            cin>>s1>>tmp>>s2;
            Map[q[s1]][q[s2]]=tmp;
        }
        
        for(k=1;k<=n;k++)
         for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
           if(Map[i][j]<Map[i][k]*Map[k][j])
            Map[i][j]=Map[i][k]*Map[k][j];
       
       flag=false;
       for(i=1;i<=n;i++)
        if(Map[i][i]>1) {flag=true;break;}
       printf("Case %d: ",++Case);
       if(flag) printf("Yes\n");
       else printf("No\n");
    }
    return 0;
}
HDU1245

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
#include<cmath>
using namespace std;
const double inf=100000000;
int n;
double Map[110][110],x[110],y[110],d;
int step[110][110];
int main()
{
	 int i,j,k;
     while(~scanf("%d%lf",&n,&d)){
		 n++;
		for(i=0;i<=n;i++)
		  for(j=0;j<=n;j++)
		  { 
			  Map[i][j]=inf;  
			  step[i][j]=inf;
		  }	
		for(i=1;i<n;i++)
		{
			cin>>x[i]>>y[i];
			double tmp=sqrt((x[i]*x[i])+(y[i]*y[i]));
			if(tmp-7.5<=d&&tmp>7.5){//不加tmp>7.5就错了,因为会出现负数Map
				Map[0][i]=tmp-7.5;
				step[0][i]=1;
			}
		}
		if(d>=42.5){
			Map[0][n]=42.50;
			step[0][n]=1;
		}
		for(i=1;i<n;i++)
		  for(j=i+1;j<n;j++)
		  {
			double tmp=sqrt(((x[i]-x[j])*(x[i]-x[j]))+((y[i]-y[j])*(y[i]-y[j])));
			if(tmp<=d){
				Map[i][j]=tmp;
				step[i][j]=1;
				Map[j][i]=tmp;
				step[j][i]=1;
			}
		 }
		for(i=1;i<n;i++)
		{
			double tmp=min(abs(50-x[i]),abs(50+x[i]));
			tmp=min(tmp,abs(50-y[i]));
			tmp=min(tmp,abs(50+y[i]));
			if(tmp<=d){
			  Map[i][n]=tmp;
			  step[i][n]=1;
			}
		}
		for(k=0;k<=n;k++)
		 for(i=0;i<=n;i++)
		  for(j=0;j<=n;j++)
		  {
				if(Map[i][j]>Map[i][k]+Map[k][j]){
					Map[i][j]=Map[i][k]+Map[k][j];
					step[i][j]=step[i][k]+step[k][j];
		        }
				else if(Map[i][j]==Map[i][k]+Map[k][j])
				 step[i][j]=min(step[i][j],step[i][k]+step[k][j]);
		  }
		 if(Map[0][n]==inf) printf("can't be saved\n");
		 else printf("%.2lf %d\n",Map[0][n],step[0][n]);
     }
	return 0;
}


HDU1596
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<memory.h>
using namespace std;
double Map[1010][1010];
int main()
{
	int n,i,j,k,m,a,b;
	while(~scanf("%d",&n)){
	    for(i=1;i<=n;i++)
	     for(j=1;j<=n;j++)
	      scanf("%lf",&Map[i][j]);
	    for(k=1;k<=n;k++)
	     for(i=1;i<=n;i++)
	      for(j=1;j<=n;j++)
	        if(Map[i][j]<Map[i][k]*Map[k][j])
	         Map[i][j]=Map[i][k]*Map[k][j];
	    scanf("%d",&m);
	    while(m--){
			 scanf("%d%d",&a,&b);
			 if(Map[a][b]==0) printf("What a pity!\n");
			 else printf("%.3lf\n",Map[a][b]);
	    }
	}
	return 0;
}

HDU1535
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=1000000000;
const int Maxn=1000010;
const int Maxm=10000010;
int dis1[Maxn],Laxt1[Maxn],len1[Maxm],To1[Maxm],Next1[Maxm];
int dis2[Maxn],Laxt2[Maxn],len2[Maxm],To2[Maxm],Next2[Maxm];
int n,m,cnt1,cnt2;
queue<int>q1;
queue<int>q2;
bool w1[Maxn];
bool w2[Maxn];
void _update()
{
	dis1[1]=0;
	for(int i=2;i<=n;i++) dis1[i]=inf;
	memset(Laxt1,0,sizeof(Laxt1));
	memset(w1,0,sizeof(w1));
	cnt1=1;
	
	dis2[1]=0;
	for(int i=2;i<=n;i++) dis2[i]=inf;
	memset(Laxt2,0,sizeof(Laxt2));
	memset(w2,0,sizeof(w2));
	cnt2=1;
}
void _add(int u,int v,int d)
{
	Next1[++cnt1]=Laxt1[u];
	Laxt1[u]=cnt1;
	To1[cnt1]=v;
	len1[cnt1]=d;
	
	Next2[++cnt2]=Laxt2[v];
	Laxt2[v]=cnt2;
	To2[cnt2]=u;
	len2[cnt2]=d;
}
void _init()
{
	int i,x,y,z;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		_add(x,y,z);    
	} 
}
void _dij1()
{
	q1.push(1);
    w1[1]=true;
    while(!q1.empty()){
		 int s=q1.front();
		 q1.pop();
		 w1[s]=false;
		 for(int i=Laxt1[s];i>0;i=Next1[i]){
				if(dis1[To1[i]]>dis1[s]+len1[i]){
					dis1[To1[i]]=dis1[s]+len1[i];
					if(!w1[To1[i]]){
						w1[To1[i]]=true;
						q1.push(To1[i]);
					}
				}
		 }
    }
}
void _dij2()
{
	q2.push(1);
    w2[1]=true;
    while(!q2.empty()){
		 int s=q2.front();
		 q2.pop();
		 w2[s]=false;
		 for(int i=Laxt2[s];i>0;i=Next2[i]){
				if(dis2[To2[i]]>dis2[s]+len2[i]){
					dis2[To2[i]]=dis2[s]+len2[i];
					if(!w2[To2[i]]){
						w2[To2[i]]=true;
						q2.push(To2[i]);
					}
				}
		 }
    }
}
int main()
{
	int T,i,j,k;
	scanf("%d",&T);
    while(T--){	
		scanf("%d%d",&n,&m);
		_update();
		_init();
	    _dij1();
	    _dij2();
	    int ans=0;
	    for(i=1;i<=n;i++)
	     ans+=dis1[i]+dis2[i];
	    cout<<ans<<endl;
    } 
    return 0;
}





HDU1869
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
#include<memory.h> 
using namespace std;
const int inf=1000000000;
int Map[250][250],m,n;
int k,i,j;
int x,y,z,s,t;

int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<n;i++)
         for(j=0;j<n;j++)
          if(i!=j) Map[i][j]=inf;
        for(i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            Map[x][y]=1;
            Map[y][x]=1;
        }
        for(k=0;k<n;k++)
         for(i=0;i<n;i++)
          for(j=0;j<n;j++)
           if(Map[i][j]>Map[i][k]+Map[k][j])
            Map[i][j]=Map[i][k]+Map[k][j];
        bool flag=true;
        for(i=0;i<n;i++)
         for(j=i+1;j<n;j++)
          if(Map[i][j]>7) { flag=false;break;}
        if(flag) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

hdu1599
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
#include<memory.h> 
using namespace std;
const int inf=100000000;
int Map[250][250],mp[250][250],m,n;
int k,i,j;
int x,y,z,s,t;

int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<=n;i++)
         for(j=0;j<=n;j++)
          Map[i][j]=inf;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            if(Map[x][y]>z) Map[x][y]=z;
            if(Map[y][x]>z) Map[y][x]=z;
        }
        for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          mp[i][j]=Map[i][j];
        int  ans=inf;
        for(k=1;k<=n;k++){
            
          for(i=1;i<k;i++)
           for(j=i+1;j<k;j++)
             if(mp[i][k]+mp[j][k]+Map[i][j]<ans) 
              ans=mp[i][k]+mp[j][k]+Map[i][j];
             
          for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
              if(Map[i][j]>Map[i][k]+Map[k][j])
               Map[i][j]=Map[i][k]+Map[k][j];
        } 
        if(ans>=inf) cout<<"It's impossible."<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}


HDU1874
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
#include<memory.h> 
using namespace std;
const int inf=1000000000;
int Map[250][250],m,n;
int k,i,j;
int x,y,z,s,t;

int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<n;i++)
         for(j=0;j<n;j++)
          if(i!=j) Map[i][j]=inf;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            if(Map[x][y]>z) Map[x][y]=z;
            if(Map[y][x]>z) Map[y][x]=z;
        }
        scanf("%d%d",&s,&t);
        for(k=0;k<n;k++)
         for(i=0;i<n;i++)
          for(j=0;j<n;j++)
           if(Map[i][j]>Map[i][k]+Map[k][j])
            Map[i][j]=Map[i][k]+Map[k][j];
        if(Map[s][t]==inf) cout<<"-1"<<endl;
        else cout<<Map[s][t]<<endl;
    }
    return 0;
}

hdu2094
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<memory.h>
using namespace std;
map<string,int>q;
int Map[1000][1000];
int main(){
	int n,cnt,i,k,j;
	string s1,s2;
	while(~scanf("%d",&n)){
		if(n==0) return 0;
		cnt=0;
		q.clear();
		memset(Map,0,sizeof(Map));
		for(i=1;i<=n;i++){
			cin>>s1>>s2;
			if(q.find(s1)==q.end())  q[s1]=++cnt;
			if(q.find(s2)==q.end())  q[s2]=++cnt;
			Map[q[s1]][q[s2]]=1;
		}
		for(k=1;k<=cnt;k++)
		 for(i=1;i<=cnt;i++)
		  for(j=1;j<=cnt;j++)
		  if(Map[i][k]==1&&Map[k][j]==1) Map[i][j]=1;
		bool ok,over=false;
		for(i=1;i<=cnt;i++){
		   ok=true;
		 for(j=1;j<=cnt;j++){
			 if(i==j) continue;
		     if(Map[i][j]!=1) ok=false;
			 if(Map[j][i]==1) ok=false;		
		 }
		 if(ok) {
				printf("Yes\n");
				over=true;
				break;
		 }
		}
		if(!over) printf("No\n");
	}
	return 0;
}


HDU2112
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<map>
#include<cstring>
#include<string>
#include<memory.h> 
using namespace std;
const long long  Inf=100000000000000000;
int n,i,j,k,cnt;
long long d;
map<string,int>q;
long long  m[160][160];
string s1,t1,x,y;
int main()
{
    while(~scanf("%d",&n)){
        if(n==-1) return 0;
        cnt=0;
        for(i=1;i<=150;i++)
         for(j=1;j<=150;j++)
          if(i==j) m[i][j]=0;
          else  m[i][j]=Inf;
        q.clear();
        
        cin>>s1>>t1;
        
        for(i=1;i<=n;i++){
            cin>>x>>y>>d;
            if(q.find(x)==q.end())  q[x]=++cnt;
            if(q.find(y)==q.end())  q[y]=++cnt;
            if(m[q[x]][q[y]]>d) m[q[x]][q[y]]=d;
            if(m[q[y]][q[x]]>d) m[q[y]][q[x]]=d;
        }
        for(k=1;k<=cnt;k++)
         for(i=1;i<=cnt;i++)
          for(j=1;j<=cnt;j++)
           if(m[i][k]+m[k][j]<m[i][j]) m[i][j]=m[i][k]+m[k][j];
        if(q[s1]>=1&&q[t1]>=1&&m[q[s1]][q[t1]]!=Inf) cout<<m[q[s1]][q[t1]]<<endl;
        else cout<<"-1"<<endl;
    }
    return 0;
HDU2066
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
queue<int>q;
const int Inf=0x3f3f3f3f;;
const int Maxm=3000100;
const int Maxn=1010;
int dis[Maxn],cnt,n,Min,c,dr;
int Laxt[Maxm],Next[Maxm],To[Maxm],Len[Maxm];
int conti[Maxn],dream[Maxn];
int Win[Maxn];
void _add(int u,int v,int d){
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
    Len[cnt]=d;
    
    Next[++cnt]=Laxt[v];
    Laxt[v]=cnt;
    To[cnt]=u;
    Len[cnt]=d;
}
void _dij()
{
    while(!q.empty()){
       int s=q.front();
       q.pop();
       Win[s]=0;
       for(int i=Laxt[s];i>0;i=Next[i]){
              if(dis[s]+Len[i]<dis[To[i]])
              {
                dis[To[i]]=dis[s]+Len[i];
                if(!Win[To[i]]) { 
                    q.push(To[i]);
                    Win[To[i]]=1; 
                }
            } 
       }
    }
}
int main()
{
    int m,i,j,k,x,y,z;
    while(cin>>m>>c>>dr)
    {
        memset(Laxt,0,sizeof(Laxt));
        memset(Next,0,sizeof(Next));
        memset(Win,0,sizeof(Win));
        cnt=1; 
        for(i=1;i<=m;i++) {
            scanf("%d%d%d",&x,&y,&z);
            _add(x,y,z);
            dis[x]=Inf;
            dis[y]=Inf;
        }
        for(i=1;i<=c;i++) {
          scanf("%d",&conti[i]);
          dis[conti[i]]=0;
          q.push(conti[i]);
          Win[conti[i]]=1;
        }
        for(i=1;i<=dr;i++) {
          scanf("%d",&dream[i]);
          dis[dream[i]]=Inf;
        }
        _dij();
        Min=Inf;
        for(j=1;j<=dr;j++)
         if(Min>dis[dream[j]]) {
           Min=dis[dream[j]];
         }
        printf("%d\n",Min);
    }    
    return 0;
}


HDU4284

HDU4284
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
using namespace std;
const int inf=0x3fffffff;
int Map[110][110];
int City[20],Ci[20],Di[20];
int n,m,Mon,H,T;
int used[120]; 
bool ok;
void _tempt(int u,int k,int tmp)
{
      if(k==H)
       if(tmp>=Map[u][1]){
            ok=true;
            return ;
       }
      for(int i=1;i<=H;i++){
            if(used[City[i]]!=T&&Map[u][City[i]]!=inf){
                 if(tmp-Map[u][City[i]]>=Di[i])
                  {    
                        used[City[i]]=T;
                        _tempt(City[i],k+1,tmp-Map[u][City[i]]-Di[i]+Ci[i]);
                  }
                 if(ok) return ;
                 used[City[i]]=0;
            }
      }
}
int main()
{
    int x,y,z,i,j,k;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&Mon);
        for(i=0;i<=n;i++)
         for(j=0;j<=n;j++)
         if(i==j) Map[i][j]=0;
         else Map[i][j]=inf;
          
        for(i=1;i<=m;i++){
           scanf("%d%d%d",&x,&y,&z);
           if(z<Map[x][y]) Map[x][y]=z;
           if(z<Map[y][x]) Map[y][x]=z;
        }
        
        for(k=1;k<=n;k++)
         for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
           if(Map[i][j]>Map[i][k]+Map[k][j])
            Map[i][j]=Map[i][k]+Map[k][j];
            
        scanf("%d",&H);
        for(i=1;i<=H;i++)
          scanf("%d%d%d",&City[i],&Ci[i],&Di[i]);
        ok=false;
        _tempt(1,0,Mon);
        if(ok) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值