HDU 4370 0 or 1(巧妙思路转化,0/1规划,最短路SPFA)

来源:互联网 发布:淘宝客服催单算提成吗 编辑:程序博客网 时间:2024/06/06 17:39

题目大意:给出一个n×n的矩阵,求一个n×n的只含有0和1的矩阵,使得两个矩阵位置对应的元素相乘后和最小。

思路:巧妙的思路,把题目所给的三个条件以图论的角度考虑可以转换成一个求最短路径的问题。
通过这题了解到了一个新的问题–“0/1规划”。

各种题解:
官方题解
kuangbin
cxlove

Code:

/*   W          w           w        mm          mm             222222222       7777777777777    *//*    W        w w         w        m  m        m  m          222        22              7777    *//*    w        w w         w        m  m        m  m                     22              777     *//*     w      w   w       w        m    m      m    m                    22              77      *//*     w      w    w      w        m    m      m    m                 222                77      *//*      w    w      w    w        m      m    m      m              222                  77      *//*      w    w      w    w        m      m    m      m            222                    77      *//*       w  w        w  w        m        m  m        m         222                      77      *//*       w  w        w  w        m        m  m        m      222                         77      *//*        ww          ww        m          mm          m     222222222222222             77      *///#pragma comment(linker, "/STACK:102400000,102400000")//C++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %%esp\n" :: "r"(p));//G++#include<set>#include<map>#include<queue>#include<stack>#include<ctime>#include<deque>#include<cmath>#include<vector>#include<string>#include<cctype>#include<cstdio>#include<cstdlib>#include<cstring>#include<sstream>#include<iostream>#include<algorithm>#define REP(i,s,t) for(int i=(s);i<=(t);i++)#define REP2(i,t,s) for(int i=(t);i>=s;i--)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned long ul;int n;const int MAXN=305;const int INF=0x3f3f3f3f;int path[MAXN][MAXN];bool vis[MAXN];//在队列标志int dist[MAXN];void SPFA(int start,int n){    memset(vis,false,sizeof(vis));    queue<int>Q;    for(int i=1; i<=n; i++)    {        if(i==start)        {            dist[i]=INF;        }        else        {            dist[i]=path[start][i];            Q.push(i);            vis[i]=1;        }    }    while(!Q.empty())    {        int u=Q.front();        Q.pop();        vis[u]=0;        REP(i,1,n)        {            if(dist[i]>dist[u]+path[u][i])            {                dist[i]=dist[u]+path[u][i];                if(!vis[i])                {                    vis[i]=1;                    Q.push(i);                }            }        }    }}int main(){#ifdef ONLINE_JUDGE#else    freopen("test.in","r",stdin);#endif    while(~scanf("%d",&n))    {        REP(i,1,n)        {            REP(j,1,n)            {                int c;                scanf("%d",&path[i][j]);            }        }        SPFA(1,n);        int ans=dist[n];        int c1=dist[1];        SPFA(n,n);        int c2=dist[n];        printf("%d\n",min(ans,c1+c2));    }    return 0;}
0 0
原创粉丝点击