HDU 3870 Catch the Theves

http://acm.hdu.edu.cn/showproblem.php?pid=3870

最小割转最短路

#include<iostream>
#include<queue>
using namespace std;
#include<vector>
#define N 160001
#define M 1500001
#define inf 0x7fffffff
struct node{
	int next,v;
	int w;
	node(){};
	node(int a,int b,int c){
		next=a;v=b;w=c;
	}
}E[M];
int NE,head[N];
int map[401][401];
__int64 dis[N];
void init(){
	NE=0;
	memset(head,-1,sizeof(head));
}
void insert(int u,int v,int w){
	E[NE]=node(head[u],v,w);
	head[u]=NE++;
	E[NE]=node(head[v],u,w);
	head[v]=NE++;
}
bool update(int u,int v,int w){
	if(dis[u]+w<dis[v]){
		dis[v]=dis[u]+w;
		return true;
	}
	return false;
}
struct cmp{
    bool operator()(const int& a,const int& b){
        return dis[a]>dis[b];
    }
};
void dijkstra(int s,int e){
    for(int i=0;i<=e;i++)
        dis[i]=inf;
    priority_queue<int,vector<int>,cmp> q;
    dis[s]=0;
    q.push(s);
    while(!q.empty()){
        int u=q.top();
		q.pop();
        if(u==e)
			break;
        for(int i=head[u];i!=-1;i=E[i].next){
            int v=E[i].v;
            if(update(u,v,E[i].w))
                q.push(v);
        }
    }
    printf("%I64d\n",dis[e]);
}

int GetInt(){
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    int num=0;
    while(ch>='0'&&ch<='9'){
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num;
}
int main(void){
	int t,n;
	scanf("%d",&t);
	while(t--){
		init();
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				map[i][j]=GetInt();
		int beg=(n-1)*(n-1)+1,end=beg+1;
		for(int i=1;i<=n-1;i++)
			for(int j=1;j<=n-1;j++){
				int u=(i-1)*(n-1)+j;
				if(i==1)
					insert(beg,u,map[i][j]);
				if(j==1)
					insert(u,end,map[i][j]);
				if(i==n-1)
					insert(u,end,map[i+1][j]);
				if(j==n-1)
					insert(beg,u,map[i][j+1]);
				if(i<n-1)
					insert(u,u+n-1,map[i+1][j]);
				if(j<n-1)
					insert(u,u+1,map[i][j+1]);
			}
		dijkstra(beg,end);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值