hdu 4370 0 or 1 (最短路)
2015-08-14 21:42
447 查看
hdu 4370 0 or 1
DescriptionGiven a n*n matrix C ij (1<=i,j<=n),We want to find a n*n matrix X ij (1<=i,j<=n),which is 0 or 1.
Besides,X ij meets the following conditions:
1.X 12+X 13+…X 1n=1
2.X 1n+X 2n+…X n-1n=1
3.for each i (1 < i < n) , satisfies ∑X ki (1<=k<=n)=∑X ij (1<=j<=n).
For example, if n=4,we can get the following equality:
X 12+X 13+X 14=1
X 14+X 24+X 34=1
X 12+X 22+X 32+X 42=X 21+X 22+X 23+X 24
X 13+X 23+X 33+X 43=X 31+X 32+X 33+X 34
Now ,we want to know the minimum of ∑C ij*X ij(1<=i,j<=n) you can get.
Hint
For sample, X 12=X 24=1,all other X ij is 0.
Input
The input consists of multiple test cases (less than 35 case).
For each test case ,the first line contains one integer n (1 < n<=300).
The next n lines, for each lines, each of which contains n integers, illustrating the matrix C, The j-th integer on i-th line is C ij(0<=C ij<=100000).
Output
For each case, output the minimum of ∑C ij*X ij you can get.
Sample Input
4
1 2 4 10
2 0 1 1
2 2 0 5
6 3 1 2
Sample Output
3
Hint
For sample, X 12=X 24=1,all other X ij is 0.
题目大意:有一个矩阵C[i][j],和一个由01组成的矩阵X[i][j]。X矩阵满足条件:
1.X 12+X 13+…X 1n=1
2.X 1n+X 2n+…X n-1n=1
3.for each i (1 < i < n) , satisfies ∑X ki (1<=k<=n)=∑X ij (1<=j<=n).
现在要求最小的∑C ij*X ij。
解题思路:思维转换过来就好做了。从第一个条件可以看出一号结点出度为1,从第二个条件可以看出n号节点的入度为1,从第三个条件可以看出2~n-1号节点的入度必须等于出度。所以可以直接把C[i][j]看成是一张邻接矩阵,1为起点,n为终点,跑一次最短路,求出最短路sp。
这是其中一种情况,还有另一种情况满足题目条件,就是,1号结点有非自环的闭环,n号结点也有非自环的闭环。以1为起点,但d[1]置为INF,且起点不入队列,而让,与1号结点连向的点进入队列,然后跑最短路,最后d[1]就是1结点的最小闭环b1,n的最小闭环b2同理。
所以最后答案就是min(sp, b1 + b2)。
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std; const int N = 305; const int M = 90000; const int INF = 0x3f3f3f3f; typedef long long ll; int n, Gra ; int d , vis , en; int head[M]; struct node { int to, dis, next; }edge[M]; void addEdge(int u,int v,int x) { edge[en].to = v; edge[en].next = head[u]; edge[en].dis = x; head[u] = en++; } void SPFA(int s) { queue<int> Q; for (int i = 0; i <= n; i++) d[i] = INF; for (int i = head[s]; i != -1; i = edge[i].next) { int v = edge[i].to; if (v == s) continue; d[v] = edge[i].dis; Q.push(v); vis[v] = 1; } while(!Q.empty()) { int u = Q.front(); Q.pop(); vis[u] = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(d[u] + edge[i].dis < d[v]) { d[v] = d[u] + edge[i].dis; if(!vis[v]) { Q.push(v); vis[v] = 1; } } } } } void init() { en = 0; for (int i = 0; i <= n; i++) { vis[i] = 0; head[i] = -1; } } void input() { int a; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &a); addEdge(i, j, a); } } } void solve() { SPFA(1); int ans = d , temp1 = d[1]; SPFA(n); int temp2 = d ; printf("%d\n", min(ans, temp1 + temp2)); } int main() { while (scanf("%d", &n) != EOF) { init(); input(); solve(); } return 0; }
相关文章推荐
- HAVOK只碰撞一个shape的一面
- CocoaPods第三方库管理 iOS
- poj-2367 Genealogical tree
- 6174问题
- hdu5024
- 进程间通信的方式
- 排序算法整理
- 第四天:内存管理-property参数
- android调用httpclient.excute报android.os.NetworkOnMainThreadException 异常处理
- Html5 Canvas笔记(1)-CanvasAppTemplate代码
- android学习之Service的笔记,里面service里有监听用户通话状态的实例
- Hibernate的一对多增改级联操作
- iOS_UIImage中 + imageNamed: 和 + imageWithContentsOfFile:两个方法的区别
- Number of 1 Bits
- 算法的时间复杂度
- hdu 1002 A + B Problem II(大正整数相加)
- 112 Path Sum
- java通过JDBC链接SQLServer2012
- hadoop论坛实战项目
- 并发技巧